我对以下代码段的结果有些怀疑。先感谢您! 为什么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;
}
答案 0 :(得分:6)
由于您的类A1
具有非虚拟析构函数,因此delete a1
会产生未定义的行为。当指针实际指向delete
对象时,将A1 *
应用于类型B1
的指针是违法的,除非类A1
具有虚析构函数。
您观察到的只是未定义行为的具体表现。
将A1
的析构函数声明为virtual
,您应该开始观察正确的行为。