【问题标题】:destructor execution order in C++C ++中的析构函数执行顺序
【发布时间】:2016-04-20 13:09:25
【问题描述】:

我对下面sn-p的结果有些疑惑。先感谢您! 为什么不调用 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;
}

【问题讨论】:

  • 你有什么“疑问”?你有什么问题?
  • 您向我们展示的代码没有调用任何析构函数,并且与您展示的输出不匹配。它甚至没有编译,想想吧。
  • 抱歉我的编辑不好。现在问题已正确编辑。

标签: c++ inheritance destructor


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2017-06-13
    • 2010-12-25
    • 2019-11-13
    • 2012-04-10
    • 2018-05-08
    • 2011-10-28
    • 2016-03-18
    • 2020-04-08
    相关资源
    最近更新 更多