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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条款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析构函数提供一份定义

以上是关于条款7:为多态基类声明virtual析构函数的主要内容,如果未能解决你的问题,请参考以下文章

NO.6: 为多态基类声明virtual析构函数

改善程序与设计的55个具体做法 day3

effective c++学习笔记

浅谈多态基类析构函数声明为虚函数

浅谈多态基类析构函数声明为虚函数

C++ 虚拟析构函数 (virtual destructor)