EffectiveC++学习笔记-条款7

条款7 为多态基类声明virtual析构函数
例如设计一个记录时间的基类

class TimeKeeper
{
public:
    TimeKeeper();
    ~TimeKeeper();
    ...
}

classs AtomicClock : public TimeKeeper{...};//原子钟
classs WaterClock: public TimeKeeper{...};//水钟
classs WristWatch: public TimeKeeper{...};//腕表

我们可以使用工厂返回一个计时对象,

TimeKeeper* getTimeKeeper();
...
delete ptk;

另外条款13说过:依赖客户执行的delete动作,基本上表带有某种错误倾向。(智能指针之后再说)

于是我们delete的只是AtomicClock 中TimeKeeper的部分,为了避免这样,我们需要在TimeKeeper中的析构函数声明为virtual

但是不想作为bass class的类,最好不用让其析构函数声明为virtual。
例如表示一个二维点:

class Point
{
public:
    Point(int xCoord, int yCoord);
    ~Point();
private:
    int x,y;

假如int占用32bits,Point对象可以放入一个64-bit的缓存器,可以传给例如C语言编写的函数中。
但是Point析构函数是一个virtual时,他将会有一个vptr,用来决定运行期哪一个virtual函数被调用,32-bit计算机体系中将占用到96bits!或者64bit计算机可能占用到128bits!这样对象大小就增大了50%-100%。
只有当class中至少含有一个virtual函数,才为他声明virtual析构函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值