https://github.com/peterdemin/virtual-destruction-5-centsの例に従って、C++ での破壊動作を理解しようとしてい ます。
そのリストは考えられるすべてのフローを満たしていますか? 何を追加する必要がありますか?与えられた例をどのように短い用語に変換できますか?
https://stackoverflow.com/a/461224/135079は、「基本クラスのデストラクタがポリモーフィックに操作されることを意図している場合は、常に仮想化する」という考えに至りました。これはシナリオ 4 をカバーしていません。
Scott Meyers の「Effective C++」の項目 7 には、次のように記載されています。
- クラスに仮想関数がある場合は、仮想デストラクタが必要です。
- 基本クラスとして設計されていないクラス、または多態的に使用するように設計されていないクラスは、仮想デストラクタを宣言しないでください。
これは軽く (べきであり、すべきではない)、シナリオ 2 に直面します。
アップデート
6502が提供する C++ 標準を疑似コードとして書き直しました。
if static type of object is different from its dynamic type:
if the static type is a base class of the dynamic type:
if the static type has a virtual destructor:
We're fine - dynamic type's destructor will be called
else:
behavior is undefined [1]
else:
behavior is undefined [2]
[1] コードは警告なしでコンパイルされ、おそらく正常に動作しますが、保証されておらず、実行時に絡み合ったエラーが発生する可能性があります。
[2] それは厄介です:
class A {};
class B {};
B *a = (B*)(new A());
delete a;