天天看點

條款07:為多态基類聲明virtual析構函數

因為C++明确指出,當derived class對象經由一個base class指針被删除,而該base class帶着一個non-vritual析構函數,其結果将未有定義---通常發生的是對象的derived成分沒有被銷毀。

解決:給base class一個virtual析構函數。此後删除derived classs對象就會如你想要的那樣,銷毀整個對象,包括所有derived class成分:

class TimeKeeper

{

public:

TimeKeeper();

virtual ~TimeKeeper();

...

};

TimeKeeper* ptk=getTimeKeeper();

有時候你想要擁有一個抽象類,但手上沒有任何pure virtual函數,怎麼辦呢?由于抽象class總是企圖作為一個base class來用,而又由于base class應該有個virtual 析構函數,并且由于pure virtual 函數會導緻抽象class,是以

class AWOV

{

public:

virtual ~AWOV()=0;

};

結論:

1.如果要實作多态基類應該聲明一個virtual 析構函數。如果class 帶有任何virtual 函數,它就應該擁有一個virtual析構函數。

2.如果class的設計目的不是作為基類使用,或不是為了實作多态,就不該聲明virtual析構函數。

繼續閱讀