3

基本クラスと派生クラスがあり、親仮想のデストラクタを削除したが、サブクラス型のオブジェクトをインスタンス化した場合、破棄されると、親デストラクタの権利が呼び出されます(仮想以降)?派生クラスでデストラクタも宣言すると、両方のデストラクタ(ベースと派生)が呼び出されますか?前もって感謝します :-)。

私の質問の2番目の部分は、最初の部分に関するものです。基本クラスのデストラクタを仮想として宣言する必要があるのはなぜですか。建設業者が階層を循環させないでください。彼らは同じ名前を共有していません、それでそれの必要性はどこにありますか?それはdestrucotrsに対して同じように機能するべきではありませんか、それともデフォルトで呼び出されるのは1つだけですか?また、遅延バインディングを介して、すべてのクラスとオブジェクトが構成されていることを検出できますか?

編集:私の質問は仮想デストラクタだけではありませんが、デフォルトですべて呼び出されるはずなので、なぜ仮想デストラクタを宣言する必要があるのですか?

4

3 に答える 3

8

はい、親デストラクタは自動的に呼び出されます。

派生インスタンスが基本クラスインスタンスへの参照を持っていると考えるコードによって適切に破棄できるように、デストラクタを仮想化する必要があります。

非常に限られた状況では、vtableルックアップで実際に数サイクルを節約する必要がある場合は、仮想化しないで構いません。

于 2011-04-26T04:45:17.847 に答える
4

仮想デストラクタの必要性は、ポリモーフィズムのためです。次のようなものがある場合:

 class A { ... };

 class B : public A { ... };

 void destroy_class(A* input)
 {
     delete input;
 }

 int main()
 {
     B* class_ptr = new B();
     destroy_class(class_ptr); //you want the right destructor called

     return 0;
 }

少し不自然な例ですが、渡されたdestroy_class()関数のポインターを削除するときに、正しいデストラクタが呼び出されるようにする必要があります。のデストラクタclass Aが宣言されていない場合は、のデストラクタvirtualのみが呼び出され、のデストラクタやその他の派生型のはclass A呼び出されません。class Bclass A

このようなものは、テンプレート以外のポリモーフィックデータ構造などの事実であることがよくあります。この場合、単一の削除関数で、派生型のオブジェクトを実際に指す基本クラス型のポインタを削除する必要があります。

于 2011-04-26T04:45:09.627 に答える
2

rubixibuc、

ええ、サブクラスのデストラクタが最初に呼び出され、次にスーパークラスになります...次にスーパークラスになり、オブジェクトのデストラクタに到達するまで続きます。

詳細はこちら:http ://www.devx.com/tips/Tip/13059 ...読む価値があります...画面一杯ですが、有益な画面一杯です。

于 2011-04-26T04:47:22.363 に答える