Item 07-为多态基类声明virtual析构函数
Declare destructors virtual in polymorphic base class
why? http://blog.csdn.net/wxqian25/article/details/7361069
Ex: 记录时间有多种做法,一个基类和一些派生类
class TimeKeeper{ // base class 基类
public:
TimeKeeper();
~TimeKeeper();
...
}
class AtomicClock:public TimeKeeper{...} //原子钟 derived类
class WaterClock:public TimeKeeper{...} //水钟 derived类
class WristClock:public TimeKeeper{...} //腕表 derived类
int main()
{
AtomicClock *p1 = new AtomicClock() //派生类
delete p1; //基类,派生类的析构函数都被执行
TimeKeeper *p2 = new AtomicClock() //base class
delete p2; //base class析构函数被执行,但是derived class 析构函数未被执行!!!,会造成内存泄漏!!!
}
解决办法:给base class一个virtual析构函数,此后就会执行derived class析构函数,即virtual ~TimeKeeper();
虚函数是C++中用于实现多态的机制,核心理念是通过基类访问派生类定义的函数。(只能借助与指针或引用来达到多态效果)
当class内至少有一个virtual函数,才会为它声明virtual析构函数。
析构函数的运作方式:最深层派生(most derived)的那个class,其析构函数最先被调用,然后是其每一个base class的析构函数都会被调用。
请记住:
1、"给base classes一个virtual析构函数"这个规则只适用与polymorphic(带多态性质的)base classes身上。这种base classes的设计目的是为了用来通过base class接口处理derived class对象。
2、polymorphic(带多态性质的)base class应该声明一个virtual析构函数,如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。
3、classes的设计目如果不是作为base classes使用,或不是为了具备多态性(polymorphically),就不该声明virtual析构函数。