因為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析構函數。