条款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析构函数提供一份定义
posted @ 2017-10-01 15:01  CoderZSL  阅读(132)  评论(0编辑  收藏  举报