C++中的析构函数执行顺序

destructor execution order in C++

我对以下片段的结果有些怀疑。先感谢您! 为什么不调用 B1 析构函数?在我看来,"Dest B" 应该显示在 "Dest A" 之前 任何解释将不胜感激。

class A1 {
    public:
        A1() { cout << "Const A" << endl; }
        ~A1() { cout << "Dest A" << endl; }
        virtual const char* ClassName() const{ return ("A"); }
};

class B1:public A1 {
    public:
        B1() { cout << "Const B" << endl; }
        ~B1() { cout << "Dest B" << endl; }
        virtual const char* ClassName() const { return ("B"); }
};

void foo1(A1 *a1)
{
    cout << "foo1 has been passed an object of class " << a1->ClassName() << endl;
    delete a1;
}


int main()
{
    B1 *b1 = new B1;
    foo1(b1);
    return 0;
}

由于您的 class A1 具有 non-virtual 析构函数,因此您的 delete a1 会产生未定义的行为。当指针实际指向 B1 对象时,将 delete 应用于 A1 * 类型的指针是非法的,除非 class A1 具有虚拟析构函数。

您观察到的只是未定义行为的具体表现。

A1 的析构函数声明为 virtual,您应该开始观察正确的行为。