Effective C++ 条款7——为多态基类声明virtual析构函数

本章节就在强调一件事情,如果一个类是基类,且用于多态,那么该base class的析构函数,要写成virtual 的。如果其不是base class 或不用于多态就不要用virtual析构了。

注:多态就是基类指针指向子类对象。

可这是为什么呢?

class TimeKeeper{
public:
TimeKeeper();
~TimeKeeper();
.....
};
class AtomicClock:public TimeKeeper{....};     //原子钟
class WaterClock:public TimeKeeper{....};     //水钟
class WristWatch:public TimeKeeper{....};     //腕表

有时只是想知道时间,不去理会通过什么得到的时间那么

TimeKeeper *getTimeKeeper();//该函数返回一个指针,指向一个子类对象,如return AtomicClock *ac;
TimeKeeper *ptk=getTimeKeeper();
...
delete ptk;

那么现在就是一个子类对象经由一个基类指针删除delete。这就会发生问题,会造成局部销毁。对象 内的AtomicClock成分可能没有被销毁,而base class部分被销毁了。

只要 将基类的析构函数改为 virtual ~TimeKeeper();即可。因为virtual允许子类的实现得以客制化。


在这章节提到了新概念,虚拟函数表也就是说若一个类含有virtual函数,那么其对象成分中就会含有一个指针vptr,指向这个虚拟函数表vbtl,这个vbtl就是一个函数指针构成的数值,这些指针指向虚拟函数。注vbtl[0]指向的是类型信息,对此要详细了解可以看看“深度探索C++对象模型”讲的很好。

本章节还强调一点:不要无端的将所有class的析构函数声明为virtual。原因1、增加对象大小,2、与其他语言的结构不同(如C,其没有vbtl),不便移植。

当然那些不用于多态的基类,也不要声明为析构为virtural,没有意义。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值