effective c++阅读之旅---条款7

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

1、如果多态机制运用过程没有虚析构会怎么样?

答: 运用多态机制过程中,通过基类指针或引用指向子类,并且基类的析构函数不是虚析构函数,然后delete基类指针,但是析构过程中单纯调用的只是基类的析构函数,而子类的那一部分没有销毁,造成一种局部销毁的诡异现象!

2、那么我们啥时候需要用虚析构?
答: 任何class只要带有至少一个virtual成员函数,则几乎确定类应该有一个virtual析构函数!

3、是不是任何时候都需要添加virtual析构?
答: class不企图作为基类,则让他的析构函数为virtual不是好主意,因为会产生虚表指针和虚表造成额外的内存开销!

4、是不是我们的类没有virtual成员函数一定不会被局部销毁的诡异现象所伤害呢?
答: 不是。即使class完全不带virtual函数,也可能被"non-virtual析构问题"给伤害

我们重点说一下第4点吧!
举个例子: 标准string类不含有任何virtual函数,所以继承它并不是一个好主意!

class MyString :public std::string
{
	//...
};

//运用多态,基类指针指向派生类,然后delete释放,造成局部销毁。
//即使我们的类中完全没有虚函数!
MyString* pstr = new MyString("my string");
std::string* ps;
ps = pstr;
delete ps;//会造成资源泄漏

所以,如果企图继承一个标准容器或者没有虚析构的类,拒绝诱惑吧!!(因为c++并没有提供类似java的final class或者c# 的sealed class那样的禁止派生机制!)

总结:

  • 带多态性质的基类应该声明virtual析构函数。
  • 如果一个class带有任何virtual函数,它应该拥有一个虚析构
  • 如果class的设计目的不是作为基类或者多态性质,它就不应该声明virtual析构函数

结尾: 我是航行的小土豆,喜欢我的程序猿朋友们,欢迎点赞+关注哦!希望大家多多支持我哦!有相关不懂问题,可以留言一起探讨哦!

如有引用或转载记得标注哦!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值