2020-08-27

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的析构函数整个程序结束。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温JZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值