我想知道为什么在继承

时间:2018-01-29 23:27:49

标签: c++ c++11 pointers virtual destructor

#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;
}

Error screenshot

我不确定我认为这是我的想法。 我当然想知道为什么会发生错误。

temp分配派生类B并将其存储在指针类型(基类A)中。

此时,编译器基于指针数据类型。

未创建虚函数表,因为基类析构函数没有虚拟声明。

B类创建一个虚拟功能表。还创建了一个虚函数表指针。

当试图破坏temp时,temp调用指针数据类型析构函数并发出问题。

无法找到B类虚函数表指针。

这是因为指针数据类型是非虚基类。

2 个答案:

答案 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虚拟。