Effective C++ Item 07-为多态基类声明virtual析构函数

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析构函数。

你可能感兴趣的:(C++,effective)