据我了解,如果您在接口指针(或更具体地说是基类指针,指向派生类实例)上调用 delete,并且该声明没有虚拟析构函数,则结果行为是未定义的,并且析构函数的派生对象不会被调用。
class ITestInterface
{
public:
virtual void DoStuff() = 0;
}
class Test : public ITestInterface
{
public:
~Test(){};
virtual void DoStuff() {};
}
...
ITestInferface *pThing = new Test();
delete *pThing; // undefined
通常,您要么为基类定义一个虚拟析构函数,要么将其声明为私有以防止在接口指针上调用 delete。
如果您声明没有 vtable 的接口
class __declspec(novtable) ITestInterface
{
public:
virtual void DoStuff() = 0;
}
现在通过接口指针删除对象是明确定义的行为,并调用适当的析构函数吗?我不明白为什么会这样,但被告知不是这样。