Shi*_*eng 0 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;
}
Run Code Online (Sandbox Code Playgroud)
由于您的类A1具有非虚拟析构函数,因此delete a1会产生未定义的行为.除非类具有虚析构函数,否则在指针实际指向对象时应用于delete类型指针是非法的.A1 *B1A1
您观察到的只是未定义行为的特定表现.
声明A1析构函数virtual,你应该开始观察正确的行为.