1

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;
4

2 に答える 2