class a
{
public : ~a() { cout << "a"; };
};
class b :virtual public a
{
public : ~b() { cout << "b"; };
};
在这段代码中,当我尝试制作类似的东西时:
a* p = new b;
delete p;
给我一个错误(中止),虽然如果我删除虚拟继承它工作。 我知道在没有虚拟析构函数的情况下做这样的事情是不正确的, 但是为什么只有在我使用虚拟继承时才会出现这个错误?
最佳答案
删除,无论继承是否是虚拟的,在任何一种情况下都是未定义的行为。
父类(super class)必须有一个虚拟析构函数,以便能够使用指向父类(super class)的指针执行删除。
仅仅因为您的代码的一个变体在您的平台上工作,并不意味着任何一个变体都是有效的。它不是。将析构函数更改为虚拟析构函数,无论继承是否为虚拟,这都应该有效。
关于c++ - 在不使用虚拟析构函数的情况下删除继承对象时中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36346634/