多态下,为什么使用virtual修饰析构函数

多态下,为什么使用virtual修饰析构函数

问题:

用virtual修饰的析构函数和非虚函数的析构函数有什么区别?

当时以为:只有经过virtual修饰的析构函数,派生类生命周期结束时,才会自动的先调用派生类的析构函数,然后调用基类的析构函数;否则,只会调用派生类的析构函数,不会调用基类的析构函数。

分析:

1. 调用派生类析构函数后,会自动调用其基类析构函数

在这里插入图片描述

2. 为多态基类声明virtual析构函数

多态:

  • 派生类对虚函数进行了重写
  • 通过基类的指针或者引用去调用虚函数

通常base class会有多个derived class,有时并不关心派生类的差别,可以设计一个factory工厂函数,返回指针指向一个派生类对象,使用时,由factory来创建对象。

Basic* factory();

对象位于heap,为了避免泄漏内存和其他资源,需要将factory()返回的每个对象,适当的delete

Basic* pb = factory();
...
    
delete pb;

pb指针指向一个derived class 对象,而这个对象需要经由一个base class 指针被释放。

  • 如果目前的base class有一个non-virtual析构函数

其结果未定义——执行时通常发生的是对象的derived成分没被销毁。对于Derive对象,其Derive成分被销毁,而其基类Basic的析构函数未被调用。出现一个“局部销毁”对象
在这里插入图片描述

  • 给base class一个virtaul析构函数,就能解决这个问题
    在这里插入图片描述

tips:基类析构函数带有virtaul修饰,派生类的析构函数省略virtual也是虚函数


  • 如果class带有任何virtual函数,它就该拥有一个virtual析构函数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值