401

C ++でクラスをオーバーライドする場合(仮想デストラクタを使用)、継承クラスに仮想としてデストラクタを再度実装していますが、ベースデストラクタを呼び出す必要がありますか?

もしそうなら、私はそれがこのようなものだと想像します...

MyChildClass::~MyChildClass() // virtual in header
{
    // Call to base destructor...
    this->MyBaseClass::~MyBaseClass();

    // Some destructing specific to MyChildClass
}

私は正しいですか?

4

7 に答える 7

540

いいえ、デストラクタは構築の逆の順序で自動的に呼び出されます。(基本クラスは最後です)。基本クラスのデストラクタを呼び出さないでください。

于 2009-03-24T14:23:51.927 に答える
98

いいえ、ベースデストラクタを呼び出す必要はありません。ベースデストラクタは、派生デストラクタによって常に呼び出されます。 破壊の順序については、ここで私の関連する回答を参照してください

基本クラスに仮想デストラクタが必要な理由を理解するには、以下のコードを参照してください。

class B
{
public:
    virtual ~B()
    {
        cout<<"B destructor"<<endl;
    }
};


class D : public B
{
public:
    virtual ~D()
    {
        cout<<"D destructor"<<endl;
    }
};

あなたがするとき:

B *pD = new D();
delete pD;

次に、Bに仮想デストラクタがない場合は、〜B()のみが呼び出されます。ただし、仮想デストラクタがあるため、最初に〜D()が呼び出され、次に〜B()が呼び出されます。

于 2009-03-24T14:23:20.477 に答える
31

他の人が言ったことですが、派生クラスで仮想デストラクタを宣言する必要がないことにも注意してください。デストラクタを仮想として宣言すると、基本クラスで行うように、すべての派生デストラクタは、宣言するかどうかに関係なく仮想になります。言い換えると:

struct A {
   virtual ~A() {}
};

struct B : public A {
   virtual ~B() {}   // this is virtual
};

struct C : public A {
   ~C() {}          // this is virtual too
};
于 2009-03-24T14:29:34.363 に答える
10

いいえ。Derived から Base メソッドを明示的に呼び出して呼び出しを「チェーン」する他の仮想メソッドとは異なり、コンパイラは、コンストラクターが呼び出された順序とは逆の順序でデストラクタを呼び出すコードを生成します。

于 2009-03-24T14:34:07.427 に答える
6

いいえ、自動的に呼び出されます。

于 2009-03-24T14:23:30.680 に答える