#include <IOSTREAM>
class A
{
public:
A ()
{
}
virtual ~A()
{
std::cout<<"A freeconstructor"<<std::endl;
}
};
class B:public A
{
public:
B ()
{
}
~B()
{
std::cout<<"B freeconstructor"<<std::endl;
}
};
class C:public B
{
public:
C ()
{
}
~C()
{
std::cout<<"C freeconstructor"<<std::endl;
}
};
int main(void)
{
A *p = new C;
delete p;
while(1);
return 0;
}
运行结果:
C freeconstructor
B freeconstructor
A freeconstructor
谁能帮我解释一下为什么不是
B freeconstructor
A freeconstructor
?
析构函数的调用顺序是:先调用自身,然后是基类的析构函数。
学习了
虚析构函数的作用是 “当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用”
A是基类,指向派生类的指针,并且析构函数是虚函数,所以其所有的派生类的析构函数都会被调用。
如果你用B的指针指向C,delete B的话,只会调用B的析构函数。
如果此时A的析构函数不是虚函数的话,此时只会调用A的析构函数。
你的疑点应该是 B的析构函数没有Virtual,为什么会调用B的析构函数。
这还是回到了虚析构函数的作用,是为了 当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用
好好理解这句话的意思。 因为你删的是A,而A的析构函数是虚的,当然A的派生类的析构函数会被调用,这个和派生类的析构函数是否为虚函数没有关系。
:)