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

标签 c++ inheritance

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/

相关文章:

c# - 确定派生自哪个泛型类型对象

c++ - 从 child 继承并调用 child 的功能在 visual studio 2013 中不起作用

windows - 使用 (SetACL) 自动执行 Windows HKCU 注册表权限的批处理文件

c++ - C++接口(interface)多重继承中的歧义

c++ - 是否有开箱即用的功能来执行反向字符串分割器?

c++ - 无限脉冲响应 (IIR) 函数

c++ - opencv,找到位于图片特定位置的字母?

c++ - 使用 Intel TBB 用随机数填充数组

C++ 重载函数和隐式转换

python - 返回非实例化类类型的类型提示