私が理解しているように、インターフェイス ポインター (より具体的には、派生クラス インスタンスを指す基本クラス ポインター) で 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;
}
インターフェイスポインタを介してオブジェクトを削除すると、適切に定義された動作になり、適切なデストラクタが呼び出されますか? なぜそうなるのかはわかりませんが、そうではないと言われています。