• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

              C++博客 :: 首頁 :: 聯(lián)系 ::  :: 管理
              163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(48)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 400060
            • 排名 - 59

            最新評論

            閱讀排行榜

            評論排行榜

            設(shè)想在一個(gè)軍事應(yīng)用程序里,有一個(gè)表示敵人目標(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;

            敵人的坦克是一種特殊的敵人目標(biāo),所以會很自然地想到將它抽象為一個(gè)以公有繼承方式從enemytarget派生出來的類。因?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ù)器
            };

             

            最后,假設(shè)程序的其他某處用new動態(tài)創(chuàng)建了一個(gè)enemytank對象,然后用delete刪除掉:

            enemytarget *targetptr = new enemytank;

            ...

            delete targetptr

              這樣會發(fā)生嚴(yán)重問題,因?yàn)閏++語言標(biāo)準(zhǔn)關(guān)于這個(gè)問題的闡述非常清楚:當(dāng)通過基類的指針去刪除派生類的對象,而基類又沒有虛析構(gòu)函數(shù)時(shí),結(jié)果將是不可確定的。實(shí)際運(yùn)行時(shí)經(jīng)常發(fā)生的是,派生類的析構(gòu)函數(shù)永遠(yuǎn)不會被調(diào)用。在本例中,這意味著當(dāng)targetptr 刪除時(shí),enemytank的數(shù)量值不會改變,那么,敵人坦克的數(shù)量就是錯的。

            如果某個(gè)類不包含虛函數(shù),那一般是表示它將不作為一個(gè)基類來使用。當(dāng)一個(gè)類不準(zhǔn)備作為基類使用時(shí),使析構(gòu)函數(shù)為虛一般是個(gè)壞主意。因?yàn)樗鼤轭愒黾右粋€(gè)虛函數(shù)表,使得對象的體積翻倍,還有可能降低其可移植性。

            所以基本的一條是:無故的聲明虛析構(gòu)函數(shù)和永遠(yuǎn)不去聲明一樣是錯誤的。實(shí)際上,很多人這樣總結(jié):當(dāng)且僅當(dāng)類里包含至少一個(gè)虛函數(shù)的時(shí)候才去聲明虛析構(gòu)函數(shù)。

            抽象類是準(zhǔn)備被用做基類的,基類必須要有一個(gè)虛析構(gòu)函數(shù),純虛函數(shù)會產(chǎn)生抽象類,所以方法很簡單:在想要成為抽象類的類里聲明一個(gè)純虛析構(gòu)函數(shù)。

            這里是一個(gè)例子:

            class awov {                // awov = "abstract w/o
                                               // virtuals"
            public:
              virtual ~awov() = 0;      // 聲明一個(gè)純虛析構(gòu)函數(shù)
            };

            這個(gè)類有一個(gè)純虛函數(shù),所以它是抽象的,而且它有一個(gè)虛析構(gòu)函數(shù),所以不會產(chǎn)生析構(gòu)函數(shù)問題。但這里還有一件事:必須提供純虛析構(gòu)函數(shù)的定義:

            awov::~awov() {}           // 純虛析構(gòu)函數(shù)的定義

            這個(gè)定義是必需的,因?yàn)樘撐鰳?gòu)函數(shù)工作的方式是:最底層的派生類的析構(gòu)函數(shù)最先被調(diào)用,然后各個(gè)基類的析構(gòu)函數(shù)被調(diào)用。這就是說,即使是抽象類,編譯器也要產(chǎn)生對~awov的調(diào)用,所以要保證為它提供函數(shù)體。如果不這么做,鏈接器就會檢測出來,最后還是得回去把它添上。

            注意:如果聲明虛析構(gòu)函數(shù)為inline,將會避免調(diào)用它們時(shí)產(chǎn)生的開銷,但編譯器還是必然會在什么地方產(chǎn)生一個(gè)此函數(shù)的拷貝。

            posted on 2008-01-22 11:39 sdfasdf 閱讀(8634) 評論(4)  編輯 收藏 引用 所屬分類: C++

            Feedback

            # re: Effective C++學(xué)習(xí)筆記:確定基類有虛析構(gòu)函數(shù) 2008-01-22 17:48 minidxer
            這樣寫點(diǎn)自己的體會并沒什么不好的,只是作者在選擇發(fā)在首頁的時(shí)候好好考慮一下就是了。
            LS的說話還是文明一些比較好  回復(fù)  更多評論
              

            # re: Effective C++學(xué)習(xí)筆記:確定基類有虛析構(gòu)函數(shù) 2010-03-30 23:01 kddsly
            最底層的派生類的析構(gòu)函數(shù)最先被調(diào)用,然后各個(gè)基類的析構(gòu)函數(shù)被調(diào)用.
            這句話是不是說反了,不是先基類的析構(gòu)被調(diào)用,然后才是派生類的被調(diào)用嗎?   回復(fù)  更多評論
              

            # re: Effective C++學(xué)習(xí)筆記:確定基類有虛析構(gòu)函數(shù) 2011-01-20 10:14 SS
            奇怪啊,好像純虛函數(shù)是不能被定義的吧,為什么還可以
            awov::~awov() {} // 純虛析構(gòu)函數(shù)的定義

              回復(fù)  更多評論
              

            # re: Effective C++學(xué)習(xí)筆記:確定基類有虛析構(gòu)函數(shù) 2012-01-13 05:19 Jocuri online
            好的網(wǎng)站  回復(fù)  更多評論
              

            四虎国产精品免费久久| 久久99国产精品一区二区| 色综合久久综精品| 亚洲成色999久久网站| 精品久久久无码中文字幕| 久久精品国产国产精品四凭| 久久夜色精品国产噜噜亚洲a| 精品国产乱码久久久久软件 | 亚洲国产精品久久久久久| 91久久精品视频| 免费精品久久天干天干| 97久久精品无码一区二区| 国内精品免费久久影院| 久久99久久99精品免视看动漫| 久久亚洲国产中v天仙www| 一本久久综合亚洲鲁鲁五月天| 久久久久久亚洲Av无码精品专口| 精品久久久久国产免费| 久久精品国产亚洲AV嫖农村妇女| 久久久精品无码专区不卡| 国产亚洲精品自在久久| 亚洲国产精品综合久久一线 | 久久久黄片| 日韩人妻无码一区二区三区久久| 国产成人精品久久一区二区三区av | 精品欧美一区二区三区久久久 | 久久久久久久精品妇女99| 99久久99这里只有免费费精品| 无码人妻少妇久久中文字幕| 久久精品国产亚洲麻豆| 亚洲国产另类久久久精品黑人 | 九九精品99久久久香蕉| 精品久久久久久久久免费影院| 精品久久久无码中文字幕天天| 2022年国产精品久久久久| 久久精品一本到99热免费| 热re99久久精品国99热| 精品熟女少妇av免费久久| 99久久99这里只有免费费精品| 久久久久高潮毛片免费全部播放| 亚洲精品乱码久久久久久中文字幕|