8

次のことを考慮してください

class base{
    base();
    ~base();
}:

class derived : public base{

};

派生オブジェクトが破棄され、派生クラスにデストラクタが定義されていない場合、基本クラスのデストラクタが自動的に呼び出されますか?

それ以外の場合、派生クラスにもデストラクタがある場合は、基本クラスのデストラクタも明示的に呼び出す必要がありますか?

class base{
    base();
    ~base();
}:

class derived : public base{
     derived();
     ~derived
           base::~base(); //do I need this?
     }
};
4

4 に答える 4

14

この場合、基本クラスのデストラクタが自動的に呼び出されます。あなたはそれを呼ぶ必要はありません

ただし、基本クラスポインタ上でオブジェクトを破棄し、デストラクタがそうでない場合、結果は未定義の動作になりますdeletevirtual(ただし、クラッシュは発生しない可能性があります)。

virtual派生元となるクラスの場合と同様に、常にデストラクタを宣言します。基本クラスにデストラクタが必要ない場合は、virtualとにかく空のボディを持つデストラクタを含めます。

エッジケースの上記のルールには例外があります。派生クラスがポリモーフィック破壊をサポートする必要がない場合、デストラクタはである必要はありませんvirtualprotectedこの場合、代わりにそれを作成するのが正しいでしょう。詳細はこちらですが、実際にはめったに発生しないことに注意してください。

于 2011-04-05T12:01:17.903 に答える
2

派生オブジェクトが破棄され、派生クラスにデストラクタが定義されていない場合、基本クラスのデストラクタが自動的に呼び出されますか?
はい。派生クラスのデストラクタが明示的に定義されているかどうかに関係なく、基本クラスのデストラクタは派生クラスのデストラクタの後に自動的に呼び出されます。

それ以外の場合、派生クラスにもデストラクタがある場合は、基本クラスのデストラクタも明示的に呼び出す必要がありますか?
いいえ、する必要はありません。C ++には、配置新規を使用する場合を除いて、デストラクタを明示的に呼び出す必要があるシナリオはありません。

于 2011-04-05T12:08:44.963 に答える
1

いいえ、この場合、ベースコンストラクタが自動的に呼び出されるのとほぼ同じ方法で、ベースデストラクタが自動的に呼び出されます。

ただし、ポリモーフィズムを使用してベースポインタを介して破棄する場合は、デストラクタが仮想であることを確認する必要があります。そうしないと、これが機能しなくなります。

于 2011-04-05T12:03:18.013 に答える
1

派生クラスのデストラクタから基本クラスのデストラクタを呼び出さないでください。

その理由は、基本クラスのデストラクタが2回目に自動的に呼び出され、問題が発生しないようにデストラクタを作成することが問題になるためです。この質問を参照してください

于 2011-04-05T12:08:11.917 に答える