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

时间:2016-01-15 00:55:56

标签: c++ inheritance destructor

我对以下代码段的结果有些怀疑。先感谢您! 为什么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;
}

1 个答案:

答案 0 :(得分:6)

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

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

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