条款07:为多态基类声明virtual析构函数

本文探讨了为什么在多态基类中声明virtual析构函数的重要性,以防止内存泄露和确保正确调用派生类的析构逻辑。同时,指出不作为多态用途的类不应声明virtual析构函数,以节省内存并保持移植性。文章还介绍了如何在没有合适纯虚函数时将类设计为抽象类,并提醒避免继承标准库中不作为多态使用的类,如容器和string,以规避潜在问题。
摘要由CSDN通过智能技术生成

1、为什么要给多态设计带多态性质的基类声明virtual析构函数?

考虑一个场景:有一个基类指针指向了一个派生类对象,而这个派生类对象创建在堆内存上。当通过delete关键字回收这块内存时,delete的是基类的指针。此时,就会发生一种怪异的现象:该派生类的基类部分被回收了,但是派生类部分没有被回收。即:导致了内存的泄露。实际上,此时只执行了基类的析构函数,没有执行派生类的析构函数。因此,即使该对象没有在堆内存上创建,但是如果析构函数中函数某些逻辑代码时,也为导致不明确行为的发生。这时虽然没有发生内存泄露,但是代码却出错了。因此,多态基类声明virtual析构函数。

2、为什么不作为多态用途使用的类的析构函数一定不能加virtual?

有下面两个原因:

  • 浪费内存
  • 降低了移植性

将析构函数声明为virtual,则代表这个类作为多态使用。而作为多态使用的类是有一定内存消耗的:多态类的实例化对象内部都有一个指针,指向虚函数表。而每一个作为多态使用的类都有一个虚函数表,用来在运行程序时确定执行哪一个函数。当将一个不作为多态使用的类的析构函数声明为virtual时,首先会增加这些内存。其次,从语言移植性来讲,由于破坏了类对象的原本的存储的结构,C++代码向C或其它代码的一致性也降低了。

3、欲将一个类设计为抽象类,却没有合适可用的纯虚函数时的一个技巧

首先抽象类一定是作为基类使用的,而抽象类一定会作为多态使用。因此可以将其析构函数声明为纯虚函数。但是这里有一个注意的点,即:需

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值