条款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析构函数提供一份定义