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

1.假设有如下时间类:
    class TimeKeeper
    {
    public:
      TimeKeeper();
      ~TimeKeeper();
    };
    class AtomicClock :public TimeKeeper {};
    factory函数(用户只是想调用时间,而不想操心时间如何计算等细节):TimeKeeper *getTimeKeeper()
    //返回一个base class指针,并指向新生成的derived class
    TimeKeeper *a = getTimeKeeper(); //动态分配一个对象
    delete a; //释放
  这种做法会产生问题,因为getTimeKeeper返回的指针指向一个dervied class对象,而这个对象释放却使用了base class中的non-virtual析构函数。产生的后果是:可能对象中dervied class中的成分并未被删除。造成“局部销毁的错误”。
  消除这个错误的方法是在base class中定义一个virtual析构函数:virtual ~TimeKeeper()
  如果某个类并不是base class,将它的析构函数声明为virtual并不是一种好的做法。
2.如果class没有不是基类,那么就不需要virtual函数,virtual会消耗更多的内存,虚指针和虚表
3.纯虚函数最好给pure virtual析构函数提供一份定义

转载于:https://www.cnblogs.com/CoderZSL/p/7617197.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值