C++中虚析构函数执行顺序问题
当对象结束生命周期时,系统自动执行析构函数。析构函数往往用来作清理善后工作。在继承派生时为防止内存泄漏我们有时要用到虚析构函数。那么虚析构函数执行顺序是什么呢?来看下面一段代码
```cpp
class Base1
{
public:
virtual void display() const;
virtual ~Base1()
{
cout<<"Base1 destructor"<<endl;
}
};
void Base1::display() const
{
cout<<"Base1::display()"<<endl;
}
class Base2:public Base1
{
public:
void display() const;
virtual ~Base2()
{
cout<<"Base2 destructor"<<endl;
}
};
void Base2::display() const
{
cout<<"Base2::display()"<<endl;
}
class Derived:public Base2
{
public:
void display() const;
Derived()
{
p=new int(0);
}
~Derived()
{
cout<<"Derived destructor"<<endl;
delete p;
}
private:
int * p;
};
void Derived::display() const
{
cout<<"Derived::display()"<<endl;
}
void fun1(Base1 * ptr)
{
ptr->display();
}
void fun2(Base1 * ptr)
{
delete ptr;
}
int main()
{
Base1 base1;
Base2 base2;
Derived derived;
fun1(&base1);
fun1(&base2);
fun1(&derived);
Base1 * b=new Derived();
fun2(b);
return 0;
}
输出结果:
Base1::display()//main函数执行到fun1(&base1)时调用虚函数display输出
Base2::display()//main函数执行到fun1(&base2)时调用虚函数display输出
Derived::display()//main函数执行到fun1(&derived)时调用虚函数display输出
Derived destructor//调用fun2析构掉Derived对象b由于在Base1和Base2中析构函数都是虚函数所以Derived也继承了这些虚析构函数所以依次输出Derived,Base2,Base1的析构函数。
Base2 destructor
Base1 destructor
Derived destructor//fun2执行完毕后所有对象结束生命周期,此时依次调用三个对象的析构函数先创建的后析构后创建的先析构Derived先析构结果同上。
Base2 destructor
Base1 destructor
Base2 destructor//Derived析构完成以后再调用Base2的析构函数由于Base1的析构函数也是虚函数所以也会输出Base1的结果
Base1 destructor
Base1 destructor//最后调用Base1的析构函数整个程序结束。