C++ 我想知道为什么在继承中调用析构函数时出错 #包括 使用名称空间std; 甲级 { 公众: 如果指针指向基子对象,则指向类型没有虚拟析构函数的指针上的A(){cout

C++ 我想知道为什么在继承中调用析构函数时出错 #包括 使用名称空间std; 甲级 { 公众: 如果指针指向基子对象,则指向类型没有虚拟析构函数的指针上的A(){cout,c++,c++11,pointers,virtual,destructor,C++,C++11,Pointers,Virtual,Destructor,delete具有未定义的行为。temp指向B实例的基子对象,并且A::~A是非虚拟的 若要修复,请声明A::~A虚拟。您的代码将调用。 斯科特·迈尔斯(Scott Meyers)的《有效的C++》一书摘录解释了原因: 通过指向基类的指针删除派生类对象时 对于非虚拟析构函数,结果是未定义的 你的基类A应该有一个虚拟析构函数: #include<iostream> using namespace std; class A { public: A() { cout <<

delete
具有未定义的行为。
temp
指向
B
实例的基子对象,并且
A::~A
是非虚拟的

若要修复,请声明
A::~A
虚拟。

您的代码将调用。 斯科特·迈尔斯(Scott Meyers)的《有效的C++》一书摘录解释了原因:

通过指向基类的指针删除派生类对象时 对于非虚拟析构函数,结果是未定义的

你的基类
A
应该有一个虚拟析构函数:

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

virtual~A()也就是说,您的<代码>删除临时; >给出了未定义的行为。也忘记了虚拟函数表。标准中没有这样的事情。每当函数被调用时,它恰好是<代码>虚拟< /C>。然后调用最派生的重写函数。这就是它的全部内容。您的C++书应该解释虚拟析构函数和继承。可能重复的
virtual ~A() { std::cout << "A Destroyer" << '\n'; }