0

私が理解しているように、インターフェイス ポインター (より具体的には、派生クラス インスタンスを指す基本クラス ポインター) で delete を呼び出し、その宣言に仮想デストラクタがない場合、結果の動作は未定義であり、デストラクタはの派生オブジェクトは呼び出されません。

class ITestInterface
{
  public:
    virtual void DoStuff() = 0;
}

class Test : public ITestInterface
{
  public:
     ~Test(){};

     virtual void DoStuff() {};
}

...

ITestInferface *pThing = new Test();
delete *pThing; // undefined

通常は、基底クラスの仮想デストラクタを定義するか、インターフェイス ポインタでの削除の呼び出しを防ぐためにそれをプライベートに宣言します。

vtable なしでインターフェイスを宣言する場合

class __declspec(novtable) ITestInterface
{
  public:
    virtual void DoStuff() = 0;
}

インターフェイスポインタを介してオブジェクトを削除すると、適切に定義された動作になり、適切なデストラクタが呼び出されますか? なぜそうなるのかはわかりませんが、そうではないと言われています。

4

1 に答える 1