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" { public: virtual ~AWOV() = 0 ;// 聲明pure virtual析構函數 } ;
此時沒必要擔憂析構函數的問題,但必需要爲~AWOV()函數提供一個定義,由於編譯器會在AWOV的derived class中建立一個調用該函數的動做。code
結論:對象
1. ploymorphic(多態) base classes應聲明一個virtual析構函數。若是class帶有任何virtual函數,他們就應該有一個virtual析構函數。blog
2. class的設計目的若是不是做爲base class 使用,或者不是爲了具有多態性,就不能聲明爲virtual析構函數。繼承