1. 程式人生 > >effective c++ 條款07:為多態基類聲明virtual析構函數

effective c++ 條款07:為多態基類聲明virtual析構函數

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