effective c++(07)之爲多態基類聲明virtual析構函數

class TimeKeeper
{
public:
    TimeKeeper() ;
    ~TimeKepper() ;
    ...
} ;
class AtomicClock:public TimeKeeper{...}// 原子鐘
class WaterClock:public TimeKeeper{...}// 水鍾
class WristWatch:public TimeKeeper{...}// 腕錶

根據工廠模式,會返回一個base class指針指向新生成的derived class對象。數據結構

TimeKeeper* getTimeKeeper() ;// 返回一個指針,指向一個TimeKeeper派生類的動態分配對象

若是delete掉(若是不delete則有可能會形成內存或者其餘資源泄露)返回的指針。以下:函數

TimeKeeper* ptk = getTimeKeeper();// 從TimeKeeper繼承體系得到一個動態內存分配對象。
...
delete ptk ;// 釋放它,避免資源泄露。

此時若是基類有non-virtual析構函數,此時調用delete以後只銷毀了base class,而derived class沒有被銷燬。解決方法是將base class的析構函數定義成virtual函數。此時會形成資源泄露,敗壞數據結構,在調試器上浪費時間等現象。spa

若是class中不含有virtual函數說明他不想作爲一個基類。設計

若是試圖繼承一個標準容器或者任何其餘"non-virtual"析構函數的class,拒絕誘惑吧。。。指針

對於pure virtual函數以下:調試

class AWOV    // AWOV = "Abstract w/o Virtuals"
{
publicvirtual ~AWOV() = 0// 聲明pure virtual析構函數
} ;

此時沒必要擔憂析構函數的問題,但必需要爲~AWOV()函數提供一個定義,由於編譯器會在AWOV的derived class中建立一個調用該函數的動做。code

結論:對象

1. ploymorphic(多態) base classes應聲明一個virtual析構函數。若是class帶有任何virtual函數,他們就應該有一個virtual析構函數。blog

2. class的設計目的若是不是做爲base class 使用,或者不是爲了具有多態性,就不能聲明爲virtual析構函數。繼承

相關文章
相關標籤/搜索