设计一个TimeKeeper base class 和一些 derived classes 作为不同的计时方法。
class Timekeeper {
public:
Timerkeeper();
~Timekeeper();
};
class AtomicClock: public TimeKeeper{ }; // 原子钟
class WaterClock: public TimeKeeper{}; // 水钟
class WristWatch: public TimeKeeper{}; // 腕表
如果getTimeKeeper 返回指针指向一个AtomicClock对象, 其内的AtomicClock成分很可能没被销毁, 而AtomicClock的析构函数也未能执行起来。 然而其base class 成分通常会被销毁, 于是造成一个诡异的"局部销毁"对象。 这容易造成资源泄漏、难以调试。
解决方法: 给base class 一个 virtual析构函数。 此后删除derived class 对象就会销毁整个对象, 包括所有derived class 成分:
class TimeKeeper {
public:
TimeKeeper();
virtual ~TimeKeeper();
};
TimerKeeper* ptk = getTimeKeeper();
delete ptk; // 现在正确
总结
- polymorphic(带多态性质的) base classes 应该声明一个virtual 析构函数。 如果 class 带有任何virtual 函数, 它就应该拥有一个virtual 析构函数。
- Classes 的设计目的如果不是作为base classes 使用, 或不是为了具备多态性(polymorphically), 就不该声明virtual 析构函数。