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
,您应该开始观察正确的行为。
我对以下片段的结果有些怀疑。先感谢您!
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
,您应该开始观察正确的行为。