C++筆記三(面向?qū)ο缶幊躺希?/h1>

十一 組合和繼承

OOD(Object Oriented Design)
(1)基于對象:單一類的寫法;
(2)面向?qū)ο螅侯惻c類之間的關(guān)系,包含三種:Composition(復(fù)合)党窜、Delegation(委托)、 Inheritance(繼承)谷朝。

11.1 Composition表示has-a

14.png

如上圖所示激捏,queue類中有deque類,稱為queue has-a deque即類的復(fù)合煮盼。
這也是一種設(shè)計模式Adapter短纵,queue類擁有deque類,而且queue所有的函數(shù)功能都借用deque類來實現(xiàn)僵控。deque功能非常全香到,queue根據(jù)用戶開放部分的功能,queue是一種adapter。


15.png

這是復(fù)合在內(nèi)存中的表現(xiàn)悠就,queue類有deque類千绪,deque類有Itr類,sizeof的計算如圖所示:


16.png

類之間在復(fù)合關(guān)系下構(gòu)造函數(shù)與析構(gòu)函數(shù)的順序為:
(1)構(gòu)造由內(nèi)而外梗脾。container的構(gòu)造函數(shù)首先調(diào)用Component的default構(gòu)造函數(shù)荸型,然后才執(zhí)行自己。
Container::Container(...):Component(  ){ ... };

(2) 析構(gòu)由外而內(nèi)炸茧。container的析構(gòu)函數(shù)首先執(zhí)行自己瑞妇,然后才調(diào)用component的析構(gòu)函數(shù)。

Container::~Container(...){ ... ~Component(  ) };

11.2 Delegation(委托) (Composition by reference)

17.png

(1)如圖所示左邊有指向右邊的指針梭冠,這種叫委托辕狰。它和復(fù)合的區(qū)別是復(fù)合內(nèi)外部是一起出現(xiàn),兩者生命周期同步控漠;而委托則是允許外部先創(chuàng)建出來柳琢,等需要的時候再把內(nèi)部寫好,兩者生命周期不同步润脸。
(2) 圖示寫法叫做Handle/Body或者pointer implementation(pimpl)柬脸。左邊是對外的接口,右邊是功能的實現(xiàn)毙驯,右邊不影響左邊倒堕,右邊可以更改甚至指向別的類,具有良好的彈性爆价。

11.3 Inheritance(繼承)表示is-a

18.png

子類從父類繼承了數(shù)據(jù)和函數(shù)(函數(shù)繼承的是調(diào)用權(quán))垦巴。


19.png

類之間在繼承關(guān)系下構(gòu)造函數(shù)與析構(gòu)函數(shù)的順序為:
(1)構(gòu)造由內(nèi)而外。Derived的構(gòu)造函數(shù)首先調(diào)用Base的default構(gòu)造函數(shù)铭段,然后才執(zhí)行自己骤宣。

Derived::Derived(...):Base(  ){ ... };

(2) 析構(gòu)由外而內(nèi)。Derived的析構(gòu)函數(shù)首先執(zhí)行自己序愚,然后才調(diào)用Base的析構(gòu)函數(shù)憔披。Base class的析構(gòu)必須是virtual,否則會出現(xiàn)undefined behavior爸吮!

Derived::~Derived(...){ ... ~Base(  ) };

十二 虛函數(shù)與多態(tài)

12.1 虛函數(shù)及其應(yīng)用

繼承最有價值的是和虛函數(shù)的搭配使用芬膝。成員函數(shù)從虛函數(shù)的角度出發(fā)分為三種:
(1)non-virtual函數(shù):你不希望derived class重新定義(override,重寫)它形娇;
(2)virtual函數(shù):你希望derived class重新定義(override锰霜,重寫)它,且你對它已有默認定義桐早;
(3)pure virtual函數(shù):你希望derived class一定要重新定義(override癣缅,重寫)它厨剪,且你對它沒有默認定義。

虛函數(shù)應(yīng)用實例如下:


20.png

舊文件的開啟與讀取友存,check file name 祷膳、search file 、open file任何人寫的都差不多爬立,可以事先寫钾唬,但是因為每個人讀取的文件類型不一樣万哪,所以讀取這個動作不能事先寫侠驯。框架如下:


21.png

應(yīng)用框架CDocument中已經(jīng)事先寫好check file name 奕巍、search file等函數(shù)吟策,CMyDoc是CDocument的子類,沒法事先寫的Serialize()設(shè)計為虛函數(shù)(可能為空函數(shù)的止,也可能為純虛函數(shù))檩坚,使用流程如圖箭頭所示,創(chuàng)建一個子類的對象诅福,通過子類的對象調(diào)用父類的函數(shù)匾委,遇到Serialize()時父類函數(shù)去找子類的定義,然后再將剩余的動作完成氓润,將Serialize()延緩到子類去定義赂乐,這種用法就叫做Template Method(23種設(shè)計模式之一,Method是java中的函數(shù))咖气。
這種設(shè)計模式適合做框架挨措,MFC大量用到Template Method。

具體代碼實現(xiàn)(仿真):


22.png

12.2 繼承+復(fù)合關(guān)系下的構(gòu)造與析構(gòu)

23.png

在圖示繼承+復(fù)合關(guān)系下構(gòu)造函數(shù)與析構(gòu)函數(shù)的順序為:
(1)構(gòu)造由內(nèi)而外崩溪。Derived的構(gòu)造函數(shù)首先調(diào)用Base的default構(gòu)造函數(shù)浅役,然后調(diào)用Component的構(gòu)造函數(shù),最后才執(zhí)行自己伶唯。

Derived::Derived(...):Base(  )觉既,Component(){ ... };

(2) 析構(gòu)由外而內(nèi)。Derived的析構(gòu)函數(shù)首先執(zhí)行自己乳幸,然后調(diào)用Component的析構(gòu)函數(shù)奋救,最后調(diào)用Base的析構(gòu)函數(shù)。

Derived::~Derived(...){ ... ~Component()反惕,~Base(  ) };
24.png

在圖示繼承+復(fù)合關(guān)系下構(gòu)造函數(shù)與析構(gòu)函數(shù)的順序為:
(1)構(gòu)造由內(nèi)而外尝艘。Derived的構(gòu)造函數(shù)首先調(diào)用Component的default構(gòu)造函數(shù),然后調(diào)用Base的構(gòu)造函數(shù)姿染,最后才執(zhí)行自己背亥。

Derived::Derived(...):Component()秒际,Base(  ){ ... };

(2) 析構(gòu)由外而內(nèi)。Derived的析構(gòu)函數(shù)首先執(zhí)行自己狡汉,然后調(diào)用Base的析構(gòu)函數(shù)娄徊,最后調(diào)用Component的的析構(gòu)函數(shù)。

Derived::~Derived(...){ ... ~Base(  ) 盾戴,~Component()};

12.3 多態(tài)實例

功能最強大的是委托+繼承設(shè)計方式寄锐。
委托+繼承設(shè)計實例1(Observer):


25.png

左邊為放數(shù)據(jù)的class,右邊為觀察的class尖啡,左邊可以有很多的右邊橄仆,左邊數(shù)據(jù)裝有指向右邊指針的容器,右邊可以被繼承衅斩,將來創(chuàng)建的子類is a Observer都可以放在容器里面盆顾,所以可以產(chǎn)生不同的Observer。
左邊要提供注冊和注銷的功能畏梆,如圖attach傳入Observer放到容器里頭您宪。左邊還應(yīng)該有notify把所有Observer進行遍歷,去通知Observer奠涌,內(nèi)容由Observer寫好宪巨,左邊調(diào)用。


26.png

如圖所示有多個窗口看同一份文件或者不同角度看同一份數(shù)據(jù)溜畅。實現(xiàn)代碼如下:
27.png

委托+繼承設(shè)計實例2(Composite):
28.png

文件系統(tǒng):Primitive代表文件捏卓,Composite是一個容器,容納很多個Primitive和Composite达皿,所以設(shè)計一個父類Component天吓,Primitive和Composite都is a Component,Component和Composite是委托的關(guān)系峦椰。add函數(shù)和容器類似龄寞,add不能設(shè)計為純虛函數(shù),因為Primitive不能定義汤功。

委托+繼承設(shè)計實例3(Prototype):
我需要一個樹狀繼承體系物邑,子類未來才被派生,不知道未來子類的名稱滔金。讓派生的子類創(chuàng)建一個自己當(dāng)成原型Prototype色解,讓我有辦法去看到子類創(chuàng)建出來的的原型放在什么位置上。


29.png

在LandSatImage類里面放一個靜態(tài)的對象LAST餐茵,他的類型是LandSatImage(自己)科阎,構(gòu)造函數(shù)寫成私有的,通過私有的構(gòu)造函數(shù)調(diào)用addPrototype忿族,將自己掛上去锣笨,addPrototype是父類寫的蝌矛,它將得到的指針放到容器里頭去,這樣就可以使破折號下面創(chuàng)建的原型放到上面去错英,可以被上面看到入撒。子類準(zhǔn)備一個函數(shù)clone,它new一個自己椭岩。破折號以上可以通過原型(這是一個對象)可以調(diào)用clone這個函數(shù)茅逮,做出一個副本,如果沒有原型則不能判哥。
clone不能是靜態(tài)函數(shù)献雅,因為靜態(tài)函數(shù)的調(diào)用需要class name,這里沒有。
實現(xiàn)代碼如下:


30.png

31.png

32.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仍稀,隨后出現(xiàn)的幾起案子统诺,更是在濱河造成了極大的恐慌,老刑警劉巖良蒸,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技扼,死亡現(xiàn)場離奇詭異,居然都是意外死亡嫩痰,警方通過查閱死者的電腦和手機剿吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來串纺,“玉大人丽旅,你說我怎么就攤上這事》墓祝” “怎么了榄笙?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祷蝌。 經(jīng)常有香客問我茅撞,道長,這世上最難降的妖魔是什么巨朦? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任米丘,我火速辦了婚禮,結(jié)果婚禮上糊啡,老公的妹妹穿的比我還像新娘拄查。我一直安慰自己,他們只是感情好棚蓄,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布堕扶。 她就那樣靜靜地躺著腺毫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挣柬。 梳的紋絲不亂的頭發(fā)上潮酒,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音邪蛔,去河邊找鬼急黎。 笑死,一個胖子當(dāng)著我的面吹牛侧到,可吹牛的內(nèi)容都是我干的勃教。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼匠抗,長吁一口氣:“原來是場噩夢啊……” “哼故源!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汞贸,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤绳军,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矢腻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體门驾,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年多柑,在試婚紗的時候發(fā)現(xiàn)自己被綠了奶是。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡竣灌,死狀恐怖聂沙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情初嘹,我是刑警寧澤及汉,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站削樊,受9級特大地震影響豁生,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漫贞,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一甸箱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迅脐,春花似錦芍殖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龟梦。三九已至,卻和暖如春窃躲,著一層夾襖步出監(jiān)牢的瞬間计贰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工蒂窒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躁倒,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓洒琢,卻偏偏與公主長得像秧秉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衰抑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容