3

単純なインターフェース/実装設計を考えてみましょう。

class Base
{
public:

    virtual ~Base()
    {
        // Virtual empty destructor
    }
};

class Derived : public Base
{
public:

    virtual ~Derived()
    {
        // Lots of clean up code here
        // ...
    }
};

この設計により、次のコードが安全で有効であることを理解しています。

Base* base = new Derived();
delete base; // Both Base::~Base and Derived::~Derived get called

ただし、新しいクラスがあったかどうかを想像してみてください。

class DerivedEx : public Derived
{
public:

    // No destructor here, relying on default destructor generated by compiler
};

DerivedExは「安全」ですか?

安全のために、私は常にDerivedExに仮想の空のデストラクタを実装する必要があると想定していました。しかし、これは冗長で不必要なのか、そして私が気付いていない「落とし穴」があるのか​​どうか疑問に思っています。

4

3 に答える 3

8

はい、それでも安全です。

基本クラスのデストラクタが仮想である場合、デストラクタは自動的に仮想になります。これは、入力するかどうかに~Foo();関係virtual ~Foo();なく、コンパイラが暗黙的に定義されたデストラクタを生成できるようにする場合に当てはまります。

于 2013-01-11T15:19:17.663 に答える
4

安全。基本クラスのデストラクタがであることを確認する必要がありvirtualます。
基本クラスのデストラクタがである限りvirtual、コンパイラはすべてのデストラクタを正しい順序で呼び出すように処理します。

ほとんどの派生クラスでデストラクタが必要かどうかは、そのクラス自体に依存し、その決定は通常、三つのルールに基づいて行われます。

于 2013-01-11T15:18:46.210 に答える
3

はい、安全です。

仮想デストラクタを持つ基本クラスが存在するため、暗黙的に生成されたデストラクタは仮想になり、すべての非自明なメンバーと基本クラスのデストラクタを正しく呼び出します。

于 2013-01-11T15:21:49.437 に答える