class a
{
public : ~a() { cout << "a"; };
};
class b :virtual public a
{
public : ~b() { cout << "b"; };
};
在这段代码中,当我尝试做类似的事情时:
a* p = new b;
delete p;
给我一个错误(中止),尽管如果我删除了虚拟继承,它也会起作用。我知道在没有虚拟析构函数的情况下进行类似的事情是不正确的,但是为什么仅当我使用虚拟继承时才会出现此错误?
无论哪种继承,删除都是未定义的行为。
为了能够使用指向超类的指针执行删除,超类必须具有虚拟析构函数。
仅仅因为代码的一种变体可以在您的平台上运行,并不意味着任何一种变体都是有效的。它不是。将您的析构函数更改为虚拟析构函数,无论继承是否是虚拟的,这都应该起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句