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

Note of Justin

關(guān)于工作和讀書的筆記

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

積分與排名

  • 積分 - 53229
  • 排名 - 433

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

[原創(chuàng)文章歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息]
Justin 于 2010-02-23

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

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

因?yàn)樯厦娴奶匦裕接欣^承并不滿足“是一個(gè)”模型的需要。更可憐的是,私有繼承并不能代表一種設(shè)計(jì)思路(公有繼承代表了“是一個(gè)”的模型設(shè)計(jì)),而僅僅是“有一個(gè)”模型的一種實(shí)現(xiàn)手段(私有繼承過(guò)來(lái)的所有成員都是私有的,從這個(gè)角度來(lái)說(shuō)它就只是“實(shí)現(xiàn)”)。
另一種手段大師在Item38中有提過(guò),就是用類成員的方式來(lái)構(gòu)造,名曰composition。
既然兩者都能實(shí)現(xiàn)“有一個(gè)”模型,那么如何選擇呢?能用composition就用composition,必需私有繼承的時(shí)候方才私有繼承。

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

};

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

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

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

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

posted on 2010-03-08 09:15 Justin.H 閱讀(316) 評(píng)論(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>
            久久国产黑丝| 中文国产一区| 亚洲激情视频在线观看| 欧美日韩国产美女| 亚洲福利小视频| 激情伊人五月天久久综合| 亚洲欧美日韩中文视频| 亚洲欧美国产另类| 日韩视频免费观看高清完整版| 在线中文字幕日韩| 在线日韩欧美| 亚洲人成网站999久久久综合| 欧美日韩国产区| 欧美日韩中文字幕| 欧美午夜在线一二页| 欧美精品aa| 国产精品午夜久久| 国产日韩一区| 亚洲自拍都市欧美小说| 欧美成人国产va精品日本一级| 亚洲少妇中出一区| 亚洲欧美日本国产有色| 久久精品视频在线看| 欧美激情精品久久久久久大尺度| 亚洲电影第三页| 亚洲一区二区免费| 久久综合给合久久狠狠狠97色69| 亚洲国产精品高清久久久| 亚洲桃色在线一区| 亚洲欧美日韩爽爽影院| 午夜免费日韩视频| 久久免费精品日本久久中文字幕| 欧美激情亚洲另类| 国产一区二区视频在线观看| 久久躁日日躁aaaaxxxx| 午夜日韩福利| 欧美激情第五页| 在线观看一区二区精品视频| 日韩视频国产视频| 另类尿喷潮videofree| 亚洲伦伦在线| 亚洲午夜精品久久| 亚洲黄色在线观看| 亚洲激情在线观看| 亚洲精品综合精品自拍| 欧美成人视屏| 先锋a资源在线看亚洲| 国产精品欧美久久| 一本一本久久a久久精品牛牛影视| 国产精品99久久久久久久久| 国产精品区二区三区日本| 久久成人免费日本黄色| 蜜臀av性久久久久蜜臀aⅴ| 久久伊人亚洲| 亚洲电影免费| 欧美激情va永久在线播放| 午夜精品久久久久久久蜜桃app| 国产婷婷97碰碰久久人人蜜臀| 欧美成人一区二区三区片免费| 国产精品高潮呻吟| 亚洲黄一区二区三区| 久久精品视频在线免费观看| 一区二区三区精品视频| 久久久久久久久久码影片| 亚洲一区二区三区午夜| 欧美国产精品日韩| 欧美成人精品在线视频| 国产精品久久影院| 亚洲福利小视频| 国内精品视频一区| 亚洲欧洲偷拍精品| 欧美成年人视频网站欧美| 亚洲精选一区二区| 亚洲一二三区在线| 国产日韩欧美精品一区| 欧美大尺度在线观看| 很黄很黄激情成人| 久久永久免费| 欧美成在线观看| 欧美日韩一区二区三区| 久久精品视频免费| 欧美日韩成人一区二区三区| 欧美一区二区黄色| 欧美gay视频| 亚洲一区免费网站| 久久亚洲综合色| 欧美欧美天天天天操| 销魂美女一区二区三区视频在线| 亚洲精品一二三区| 欧美在线观看视频一区二区三区| 亚洲一区二区三区四区五区黄| 久久亚洲综合网| 美女黄色成人网| 精品成人一区| 老司机免费视频一区二区| 久久久久久九九九九| 国产一区二区看久久| 欧美一区影院| 老司机免费视频久久| 亚洲成人在线视频播放| 久久久久九九视频| 欧美高清视频| 久久精品国产免费观看| 久久久久久久999| 一区二区毛片| 亚洲大胆av| 国产视频亚洲| 国产精品xnxxcom| 蜜桃av一区二区三区| 欧美精品乱人伦久久久久久| 亚洲精品字幕| 久久福利电影| 夜夜嗨av一区二区三区中文字幕 | 欧美日韩一区二区免费在线观看 | 久久久久国产精品厨房| 欧美xx视频| 亚洲自拍偷拍福利| 亚洲国产视频直播| 国产欧美精品一区aⅴ影院| 美女精品网站| 欧美在线亚洲综合一区| 欧美91大片| 国产精品99久久久久久www| 中文国产成人精品久久一| aaa亚洲精品一二三区| 久久资源av| 久久亚洲综合网| 久久久久久久一区二区| 久久久99爱| 欧美承认网站| 夜夜嗨av色一区二区不卡| 在线综合亚洲| 亚洲综合日韩| 久久免费高清| 亚洲国产一区在线观看| 在线亚洲欧美专区二区| 欧美一区二区三区免费观看| 久久国内精品自在自线400部| 裸体丰满少妇做受久久99精品| 欧美激情二区三区| 欧美性色aⅴ视频一区日韩精品| 欧美日韩精品| 欧美激情网站在线观看| 欧美成人一区二区三区片免费| 久久夜色精品国产噜噜av| 久久精品视频一| 欧美激情综合亚洲一二区 | 欧美激情欧美狂野欧美精品| 欧美久久成人| 国产日韩在线看| 亚洲精品国久久99热| 午夜视频在线观看一区二区三区| 久久躁狠狠躁夜夜爽| 亚洲激情成人在线| 亚洲视频在线看| 久久久久成人精品| 国产精品高潮久久| 欧美日韩国产美| 国产亚洲女人久久久久毛片| 亚洲美女电影在线| 久久免费99精品久久久久久| 日韩亚洲在线观看| 欧美成人小视频| 伊伊综合在线| 欧美成人精品一区二区三区| 玖玖综合伊人| 亚洲欧洲精品天堂一级| 亚洲尤物在线视频观看| 欧美高清视频一区二区| 免费在线观看精品| 欧美婷婷久久| 国产资源精品在线观看| 亚洲免费观看在线视频| 性欧美xxxx视频在线观看| 久久婷婷久久| 亚洲精品韩国| 久久久777| 国产精品美女www爽爽爽| 精品动漫av| 先锋影音一区二区三区| 香蕉av777xxx色综合一区| 国产精品一区二区男女羞羞无遮挡 | 欧美精品在线视频| 国产精品视频免费一区| 亚洲人成人一区二区三区| 欧美影院在线播放| 91久久黄色| 久久精品成人| 国产精品影院在线观看| 欧美在线日韩| 亚洲国产黄色片| 久久久久久久久久久久久久一区| 欧美日韩综合网| 一区二区三区成人| 欧美激情一区二区三区四区| 久久精品免费观看| 国产视频久久久久| 欧美国产大片| 最近中文字幕mv在线一区二区三区四区 | 亚洲精品国产系列|