effective c++ 條款07:為多態基類聲明virtual析構函數
阿新 • • 發佈:2018-06-10
pub effective atomic water delet () IV del effect
記住:
帶多態性質的基類應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。
class的設計目的如果不是作為基類使用,或不是為了具備多態性,就不該聲明virtual析構函數。
class TimeKeeper { public: TimeKeeper(); ~TimeKeeper(); ... }; class AtomicClock: public TimeKeeper { ... }; class WaterClock: public TimeKeeper { ... }; TimeKeeper* ptk = getTimeKeeper(); //獲得一個指向derived class的對象指針 ... delete ptk; //因為TimeKeeper帶著一個非virtual的析構函數,所以derived class的析構函數不會被調用,導致資源泄露。
解決這個問題,只需要
class TimeKeeper { public: TimeKeeper(); virtual ~TimeKeeper(); ... };
virtual函數的目的是允許derived class的實現得以定制化。任何class只要帶有virtual函數,都幾乎確定應該也有一個virtual析構函數。
如果class不含virtual函數,通常表示它並不會被用作一個基類,所以其析構函數不需要為virtual。
使用pure virtual析構函數,你必須為這個pure virtual析構函數提供一份定義。
class AMOV { public: virtual ~AMOV() = 0; }; AMOV::~AMOV() {}
effective c++ 條款07:為多態基類聲明virtual析構函數