3

子クラスがデストラクタを持たない親クラス(コンパイラによって生成されたデフォルトのみ)を継承するのは悪い設計でしょうか?いくつかの本はそれが良くないと主張しましたが、それがどのような状況で起こるかについては言及していませんでした。

4

3 に答える 3

4

仮想デストラクタのない基本型へのポインタを介して派生型のオブジェクトを削除することは、未定義の動作です。これを行うことを期待している場合、および一般的にクラスの拡張を期待している場合は、virtualデストラクタを提供する必要があります。

 struct A
 {};
 struct B : A
 {}

 //...
 A* a = new B;
 delete a;       //undefined behaviour
于 2012-08-05T00:36:56.200 に答える
1

尋ねられたように、これにはおそらくまったく問題はありません。しかし、あなたの件名には「デストラクタ」と書かれていて、質問には「コンストラクタ」と書かれているので、どちらを意味するのかわかりません。基本クラスに仮想デストラクタがない場合、それが問題になる可能性があります。基本クラスのデストラクタが呼び出されなくなる可能性があります。したがって、クラスに非PODデータメンバーがある場合、それらは子クラスで適切に破棄されない可能性があります。

于 2012-08-05T00:32:42.707 に答える
1

デストラクタを仮想として設定することをお勧めします。そうすれば、将来それについて心配する必要がなくなるからです。

デストラクタを持たないクラスから継承すると、クラスを多態的に削除したときに未定義の動作が発生し、クラスデストラクタは実行されません。

デストラクタを仮想として望まない場所を私が考えることができる唯一の理由は、その関数用にvtableを作成したくない場合です。

于 2012-08-05T00:36:42.737 に答える