声明virtual函数
我们有一个TimeKeeper的基类, 有一些子类作为不同的计时方法。
class TimeKeeper
{
public:
TimeKeeper();
~TimerKeeper();
...
};
class AtomicClock : poublic TimeKeeper {}
class WaterClock : poublic TimeKeeper {}
class WritstClock : poublic TimeKeeper {}
我们设计一个工厂函数, 使之返回一个base的指针,指向derive的对象。
TimeKeeper* ptk = GetTimeKeeper();
...
delete ptk;
为了避免泄露内存, 我们需要在结束时delete指针,而问题在于getTimeKeeper返回的指针是一个基类指针, 而指向一个派生类的对象,目前的base类拥有一个no-virtual的析构函数。
当一个derive对象经由一个base指针来删除,会导致未定义的行为。对象的子类独有的资源可能未被销毁,造成局部销毁的现象。
解决问题的方法就是将基类的析构函数声明为virtual,这样就会销毁整个对象。
class TimeKeeper
{
public:
TimeKeeper();
virtual ~TimerKeeper();
...
};
TimeKeeper* ptk = getTimeKeeper();
...
delete ptk;
任何一个base类, 如果它含有virtual的函数, 就应该将其析构函数声明为virtual。
|