Насколько я понимаю, если вы вызываете 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;
}
, будет ли удаление объекта через указатель интерфейса теперь хорошо определенным поведением и вызовет соответствующий деструктор? Я не понимаю, почему это так, но мне сказали иначе.