class a
{
public : ~a() { cout << "a"; };
};
class b :virtual public a
{
public : ~b() { cout << "b"; };
};
Run Code Online (Sandbox Code Playgroud)
在这段代码中我尝试做类似的东西:
a* p = new b;
delete p;
Run Code Online (Sandbox Code Playgroud)
给我一个错误(中止),虽然如果我删除虚拟继承它工作.我知道在没有虚拟析构函数的情况下制作类似的东西是不正确的,但为什么只有在我使用虚拟继承时才出现此错误?
无论是否为继承,删除都是未定义的行为.
超类必须具有虚拟析构函数,以便能够使用指向超类的指针执行删除.
仅仅因为您的代码的一种变体适用于您的平台,并不意味着这两种变体都是有效的.它不是.将析构函数更改为虚拟析构函数,无论是否为虚拟继承,这都应该有效.