在不使用虚拟析构函数的情况下删除继承的对象时中止

Amr*_*raf 0 c++ inheritance

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)

给我一个错误(中止),虽然如果我删除虚拟继承它工作.我知道在没有虚拟析构函数的情况下制作类似的东西是不正确的,但为什么只有在我使用虚拟继承时才出现此错误?

Sam*_*hik 5

无论是否为继承,删除都是未定义的行为.

超类必须具有虚拟析构函数,以便能够使用指向超类的指针执行删除.

仅仅因为您的代码的一种变体适用于您的平台,并不意味着这两种变体都是有效的.它不是.将析构函数更改为虚拟析构函数,无论是否为虚拟继承,这都应该有效.