#include<iostream>
using namespace std;
class A
{
public:
A() { cout << "A Creator" << endl; }
~A() { cout << "A Destroyer" << endl; }
};
class B : public A
{
public:
B() { cout << "B Creator" << endl; }
virtual ~B() { cout << "B Destroyer" << endl; }
};
void main()
{
A* temp = new B;
delete temp;
}
我不确定我认为这是我的想法。 我当然想知道为什么会发生错误。
temp分配派生类B并将其存储在指针类型(基类A)中。
此时,编译器基于指针数据类型。
未创建虚函数表,因为基类析构函数没有虚拟声明。
B类创建一个虚拟功能表。还创建了一个虚函数表指针。
当试图破坏temp时,temp调用指针数据类型析构函数并发出问题。
无法找到B类虚函数表指针。
这是因为指针数据类型是非虚基类。
答案 0 :(得分:5)
您的代码调用undefined behavior。 摘自&#34; Effective C ++&#34; Scott Meyers的书解释了原因:
通过指向基类的指针删除派生类对象 使用非虚拟析构函数,结果是未定义的。
您的基类A
应该有一个虚拟析构函数:
virtual ~A() { std::cout << "A Destroyer" << '\n'; }
如果要以多态方式使用类,那么基类应该具有虚拟析构函数。
答案 1 :(得分:2)
delete
具有未定义的behviour。 temp
指向B
实例的基础子对象,A::~A
是非虚拟的。
要修复,请声明A::~A
虚拟。