C++中確定基類有虛析構(gòu)函數(shù)

字號:

有時,一個類想跟蹤它有多少個對象存在。一個簡單的方法是創(chuàng)建一個靜態(tài)類成員來統(tǒng)計(jì)對象的個數(shù)。這個成員被初始化為0,在構(gòu)造函數(shù)里加  1,析構(gòu)函數(shù)里減1。(條款m26里說明了如何把這種方法封裝起來以便很容易地添加到任何類中,“my article on counting objects”提供了對這個技術(shù)的另外一些改進(jìn))
    設(shè)想在一個軍事應(yīng)用程序里,有一個表示敵人目標(biāo)的類:
    class enemytarget {
    public:
     enemytarget() { ++numtargets; }
     enemytarget(const enemytarget&) { ++numtargets; }
     ~enemytarget() { --numtargets; }
     static size_t numberoftargets()
     { return numtargets; }
     virtual bool destroy(); // 摧毀enemytarget對象后
     // 返回成功
    private:
     static size_t numtargets; // 對象計(jì)數(shù)器
    };
    // 類的靜態(tài)成員要在類外定義;
    // 缺省初始化為0
    size_t enemytarget::numtargets;
    這個類不會為你贏得一份政府防御合同,它離國防部的要求相差太遠(yuǎn)了,但它足以滿足我們這兒說明問題的需要。
    敵人的坦克是一種特殊的敵人目標(biāo),所以會很自然地想到將它抽象為一個以公有繼承方式從enemytarget派生出來的類(參見條款35及m33)。因?yàn)椴坏P(guān)心敵人目標(biāo)的總數(shù),也要關(guān)心敵人坦克的總數(shù),所以和基類一樣,在派生類里也采用了上面提到的同樣的技巧:
    class enemytank: public enemytarget {
    public:
     enemytank() { ++numtanks; }
     enemytank(const enemytank& rhs)
     : enemytarget(rhs)
     { ++numtanks; }
     ~enemytank() { --numtanks; }
     static size_t numberoftanks()
     { return numtanks; }
     virtual bool destroy();
    private:
     static size_t numtanks; // 坦克對象計(jì)數(shù)器
    };
    (寫完以上兩個類的代碼后,你就更能夠理解條款m26對這個問題的通用解決方案了。)
    最后,假設(shè)程序的其他某處用new動態(tài)創(chuàng)建了一個enemytank對象,然后用delete刪除掉:
    enemytarget *targetptr = new enemytank;
    ...
    delete targetptr;