gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:35:34 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于c++ - C++中的析构函数执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com