多态基类的析构函数应为虚函数

小心陷阱

  • 在c++中,当 一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的,运行时比较有代表性的后果是对象的派生部分不会被销毁(tip吐舌笑脸 : 如果是直接创建一个子类的对象,则基类部分和派生部分都会析构,这里的部分析构是因为子类对象是通过基类指针动态创建的)。然而,基类部分很可能已经被销毁,这就导致了一个奇怪的“部分析构”现象,这是一个资源泄漏的问题。
  • 但是,如果不做基类,析构函数一般不要声明为虚函数,因为虚函数的实现要求对象携带额外信息,并导致类所占用的内存增加。

在继承机制下,把基类的析构函数声明为一个纯虚函数往往是一个明智之兴举。纯虚函数通常没有定义,它们是在抽象类中声明,然后在派生类中实现。

但是,在某些情况下,却需要定义一个纯虚成员函数,而不仅仅 是声明它,最常见的例子是纯虚析构函数。在声明纯虚析构函数时,不要忘了同时还要定义它。(tips吐舌笑脸 这里注意定义和声明的区别。)

  • 为什么说定义纯虚析构函数非常重要?

(1)派生类的析构函数会自动调用基类的析构函数。这个过程是递归的,最终,抽象类的纯虚析构函数也会被调用。

(2)如果纯虚析构函数只被声明而没有定义,那么会造成运行时崩溃(在很多情况下,这个错误会出现在编译期,但谁也不担保一定会是这样)。纯虚函数的虚拟实现,即空实现能够保证代码的 安全性。

 

如果一个类被继承,同时定义了基类以外的数据成员对象,且基类析构函数不是virtual修饰的,那么当基类指针或引用指向派生类对象并析构时,会调用基类的析构函数而导致派生类定义的数据成员没有被析构,产生内存泄漏问题。

如果确定不需要直接而是只通过派生类对象使用基类,可以把析构函数定义为protected(这样会导致基类和派生类外使用自动对象和delete时的错误,因为访问权限禁止调用析构函数),就不会导致以上问题的出现。

关于C++中的友元函数的总结 - 博客园  http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html

注意:一定要注意派生类的对象和派生类中的成员函数对基类的访问是不同的 。+

 

转载于:https://my.oschina.net/ray1421/blog/628846

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值