青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Note of Justin

關于工作和讀書的筆記

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

積分與排名

  • 積分 - 53598
  • 排名 - 433

最新評論

閱讀排行榜

評論排行榜

[原創文章歡迎轉載,但請保留作者信息]
Justin 于 2010-02-23

這次的筆記標題比較爛,差點害得自己沒有心情再寫下去。
當然ITEM38其實也沒什么需要多記的,ITEM32中說到了“是一個”的模型,這里要回顧的是“有一個”的模型。(原文中有兩種說法,has a和implement in terms of,然而個人竊以為意思其實差不多,在筆記里就不鉆牛角尖了……)
在“是一個”模型不適用于構建一個類或是一種關系的時候,可以考慮“有一個”。大師給的例子應該是被舉例舉爛了的:一個人“有一個”地址,“有一個”電話號碼,諸如此類。
與“是一個”不同,“有一個”模型不能用公有繼承實現,而是以類成員的方式構造的,這個道理也很淺顯:類與其成員之間的關系本來就是“有一個”。

到了第39條軍規,講的是和私有繼承有關的事情。
公有繼承中的子類對象是可以被轉換為它的父類對象的(“是一個”的關系),而私有繼承中這種轉換是不成立的。
另外一點,私有繼承中父類的所有公有和保護成員(public和protected)到了子類中,都變成了私有成員。

因為上面的特性,私有繼承并不滿足“是一個”模型的需要。更可憐的是,私有繼承并不能代表一種設計思路(公有繼承代表了“是一個”的模型設計),而僅僅是“有一個”模型的一種實現手段(私有繼承過來的所有成員都是私有的,從這個角度來說它就只是“實現”)。
另一種手段大師在Item38中有提過,就是用類成員的方式來構造,名曰composition。
既然兩者都能實現“有一個”模型,那么如何選擇呢?能用composition就用composition,必需私有繼承的時候方才私有繼承。

比如我們有個AClass:
class AClass{
public:
   
virtual void Interface_1(/*..*/);

};

以下為私有繼承:
class BClass : private AClass{
private:
   
virtual void Interface_1(/*..*/);
//..
};

而下面的composition可以達到一樣甚至更好的效果:
class AnotherAClass: public AClass{
public:
   
virtual void Interface_1(/*..*/);
//..
};

class DClass{
private:
   AnotherAClass
* a;
//..
};

【以上代碼純粹是對大師例程的簡陋抄襲,大師見諒……】
BClass和DClass都實現了“有一個”,但相比之下還是能分辨出長短:
  • DClass中的AnotherAClass是私有成員,除了它自己沒有人能夠訪問修改;而私有繼承的BClass不能保證其“擁有”的AClass實現部分不會被第三者修改,即使是私有繼承來的。(為什么這么說?看下去……)
    BClass私有繼承了AClass,相當于它“有了一個”AClass可以用,可以玩。AClass中的公有/保護成員都變成了BClass的人,但是在享受使用這些成員的同時,BClass還要承擔提供這些成員給別人服務的義務。
    ITEM35中曾經提到:虛擬函數機制和公有/私有/保護體制是沒有任何關系的。因此在例子中的Interface_1有可能在以下的情況中被替代然后“調用”:
    • 一個CClass公有繼承了BClass
    • CClass定義了自己的Interface_1版本
    • 有一個BClass的指針,指向一個CClass的對象,某個操作中調用了Interface_1(CClass的實現版本)
    這時候BClass可能要有意見了:它的作者并沒有打算讓它的繼承者修改BClass版本的Interface_1,但事實是CClass違背了它的意志!
    很曲折哈?希望我下次讀的時候還能看懂@#¥%
  • DClass由于只是定義了一個指向AnotherAClass的指針,那么在定義DClass的文件中就不需要include AClass或AnotherAClass的頭文件。于是就避免了編譯依賴(compilation dependecies)
    而BClass因為是繼承了AClass,在BClass的文件中就需要加上AClass的頭文件,也就不可避免的產生了編譯時的依賴。
由此看來,絕大部分情況下,組合方式(composition)是要優于私有繼承的。之所以說“絕大部分”,是因為大師說了:
對于EBO(Empty Base Optimization)的情況,私有繼承就顯現出了它的優勢。
所謂EBO就是這樣的一種情況,有一種特殊的類,它沒有非靜態數據成員(non-static data member),也沒有虛函數(于是不會需要空間存儲虛表)。
所以這樣的一種類其實不占用任何空間,不過因為C++不允許0字節的對象存在,而且很多編譯器都會添加額外的空間來實現字節對齊,于是這種特殊的類的實際大小應該是1個char對象的大小。
在這種類中,往往會有很多typedef,enum,靜態數據成員或者是非虛函數。所以他們還是有價值的。
需要在“有一個”關系中利用這種類的時候,如果采用composition,那么根據上面的結論,就需要付出額外的空間來“存放”這個本來不占空間的類。
然而如果是私有繼承呢,就可以避免這種情況。
(最后是我的想法:這么精打細算……現在貌似很少人會用到這個EBO了吧?如果真的需要,就再回到原書中看看例子吧。)

posted on 2010-03-08 09:15 Justin.H 閱讀(322) 評論(0)  編輯 收藏 引用 所屬分類: Effective C++ 炒冷飯
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美jizz19性欧美| 欧美激情二区三区| 一区二区三区欧美亚洲| 欧美激情免费观看| 中文国产成人精品久久一| 99精品免费网| 国产精品久久久久久久久久直播| 午夜精品久久久久久99热| 亚洲在线播放电影| 国际精品欧美精品| 欧美丰满高潮xxxx喷水动漫| 欧美va亚洲va日韩∨a综合色| 一本久道久久综合狠狠爱| 99国产精品99久久久久久粉嫩| 欧美新色视频| 久久艳片www.17c.com| 欧美成人精品在线播放| 亚洲午夜在线观看| 午夜精品久久久| 91久久午夜| 亚洲视频久久| 在线播放日韩| 99riav国产精品| 国产一区二区成人久久免费影院| 欧美不卡一区| 国产精品大全| 免费在线国产精品| 国产精品国产三级国产专播品爱网 | 欧美午夜激情视频| 欧美与欧洲交xxxx免费观看| 久久综合九色欧美综合狠狠| 一区二区三区欧美| 久久久成人精品| 亚洲影院高清在线| 老牛嫩草一区二区三区日本| 亚洲欧美日韩国产中文在线| 久久久亚洲午夜电影| 中日韩视频在线观看| 久久久精品网| 久久成人免费网| 欧美理论电影在线观看| 久久久噜噜噜久久人人看| 欧美精品二区| 免费在线国产精品| 国产精品欧美一区喷水| 亚洲国产精品一区二区三区| 国产精品专区h在线观看| 欧美激情乱人伦| 激情欧美一区二区三区| 一本色道久久综合| 99热精品在线| 欧美chengren| 欧美激情精品久久久久久久变态| 国产日韩欧美亚洲| 亚洲综合99| 亚洲欧美福利一区二区| 欧美人牲a欧美精品| 欧美a级在线| 国产一区二区在线观看免费| 亚洲色诱最新| 亚洲自拍啪啪| 欧美偷拍另类| 夜夜嗨av一区二区三区四区| 亚洲每日在线| 欧美jizzhd精品欧美巨大免费| 免费黄网站欧美| 亚洲第一主播视频| 久久九九精品| 欧美成人精品在线| 在线播放豆国产99亚洲| 久久精品国产亚洲一区二区三区| 欧美一区二区精品久久911| 欧美性大战久久久久久久| aⅴ色国产欧美| 亚洲女人天堂成人av在线| 欧美性事免费在线观看| 99精品99| 午夜久久美女| 国产精自产拍久久久久久蜜| 午夜在线精品| 久久人人97超碰国产公开结果| 激情视频一区二区三区| 老司机一区二区三区| 欧美激情国产日韩| 一本色道久久88综合亚洲精品ⅰ | av不卡在线看| 亚洲午夜黄色| 国产欧美日韩精品专区| 久久精品欧美日韩精品| 亚洲高清三级视频| 夜夜嗨一区二区三区| 国产精品丝袜白浆摸在线| 欧美一区二区精品| 欧美波霸影院| 亚洲欧美成人| 韩国精品一区二区三区| 欧美岛国激情| 亚洲欧美精品在线观看| 欧美**字幕| 亚洲一卡二卡三卡四卡五卡| 国产一区二区久久精品| 欧美电影免费观看网站| 亚洲欧美成人在线| 欧美国产日本| 欧美一区二区三区的| 在线国产欧美| 国产精品久久久久秋霞鲁丝 | 日韩亚洲一区二区| 久久aⅴ国产紧身牛仔裤| 亚洲第一页自拍| 国产精品久久久久久久午夜片| 欧美一区二区三区免费视频| 亚洲高清自拍| 久久精品国产一区二区电影| 99re66热这里只有精品3直播 | 国产精品久久久久久久久借妻 | 亚洲卡通欧美制服中文| 午夜欧美视频| 日韩视频中文字幕| 国产精品免费一区豆花| 欧美成人午夜激情在线| 久久激情网站| 亚洲影院色在线观看免费| 亚洲韩国青草视频| 久久久水蜜桃| 午夜精品一区二区三区在线视 | 精品1区2区3区4区| 欧美日韩视频| 你懂的视频一区二区| 久久国产综合精品| 亚洲少妇一区| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 开心色5月久久精品| 亚洲一区二区精品在线观看| 91久久亚洲| 亚洲大胆视频| 欧美成人免费播放| 久久青草久久| 老色鬼精品视频在线观看播放| 午夜精品一区二区三区四区| 亚洲线精品一区二区三区八戒| 亚洲欧洲日产国产综合网| 在线观看日韩精品| 国产亚洲第一区| 国产日韩欧美综合| 国产日韩精品在线播放| 国产九色精品成人porny| 欧美三级精品| 国产精品网站在线播放| 国产精品白丝黑袜喷水久久久| 欧美日韩免费观看一区三区 | 欧美区亚洲区| 欧美国产一区二区| 欧美伦理在线观看| 欧美连裤袜在线视频| 欧美久久久久久久久| 欧美精品色一区二区三区| 欧美高清视频在线播放| 欧美激情久久久久久| 欧美日韩黄色大片| 国产精品v亚洲精品v日韩精品| 国产精品视频区| 国产视频一区在线观看| 激情校园亚洲| 亚洲精品小视频在线观看| 99成人精品| 午夜视频在线观看一区| 久久国产一区二区| 美女精品国产| 亚洲精品一线二线三线无人区| 日韩视频免费观看| 性欧美超级视频| 欧美不卡视频一区| 欧美日韩一区在线播放| 国产亚洲精品自拍| 亚洲国产精品久久精品怡红院| 一区二区欧美视频| 久久国产婷婷国产香蕉| 欧美aⅴ99久久黑人专区| 亚洲日本无吗高清不卡| 午夜欧美精品| 欧美国产日韩视频| 国产精品毛片a∨一区二区三区| 激情久久婷婷| 亚洲自拍都市欧美小说| 美女精品自拍一二三四| 一区二区三区欧美在线观看| 久久久久久久久一区二区| 欧美人成在线视频| 狠狠色综合播放一区二区| 99re热精品| 米奇777在线欧美播放| 夜夜狂射影院欧美极品| 久久看片网站| 国产精品网曝门| 99视频日韩| 欧美暴力喷水在线| 亚洲欧美99| 欧美日韩在线观看一区二区| 亚洲福利在线看|