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

时间:2016-04-01 01:38:09

标签: c++ inheritance

class a
{
public : ~a() { cout << "a"; };
};
class b :virtual public a
{
public : ~b() { cout << "b"; };
};

在这段代码中,当我尝试制作类似的东西时:

a* p = new b;
delete p;

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

1 个答案:

答案 0 :(得分:5)

删除,无论继承是否为虚拟,在任何一种情况下都是未定义的行为。

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

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