4

親クラスの共有ポインターが関数の型を返すようにしてから、共有ポインターでなくても新しい子クラスを返すことはできますか? これらの状況で共有ポインターがどのように機能するかはわかりませんが、通常のポインターのように機能しますか? これが私の例です:

BaseEventPtr Actions::getEvent(const std::string& nodeName)
{
    if(asLowerCaseString(nodeName) == "action")
        return new ActionEvent(&m_interface);

    return nullptr;
}

この場合、ActionEvent は BaseEvent のサブクラスです。

乾杯!

4

1 に答える 1

2

BaseEventPtrがスマート ポインターであれば、問題ありません。

delete基本的に、参照がなくなると、共有ポインターは実際のポインターを呼び出します。基本クラスに仮想デストラクタが定義されている場合delete、適切なサブクラスのデストラクタを呼び出します。

例えば:

class NonVirtualBase {};
class NonVirtualSubclass: public NonVirtualBase {};

shared_ptr<NonVirtualBase> ptr( new NonVirtualSubclass() ); // NOT OK!

class VirtualBase
{
    virtual ~VirtualBase() {}
};

class VirtualSubclass: public VirtualBase {};

shared_ptr<VirtualBase> ptr( new VirtualSubclass() ); // OK

これは、通常の (裸の) ポインターにも当てはまります。そのため、原則として、クラスが将来基底クラスとして機能する可能性がある場合は、(空の場合でも) 仮想デストラクタを使用して定義する必要があります。

于 2012-10-12T16:03:50.837 に答える