第三周結(jié)構(gòu)框圖:
11.組合與繼承
12.虛函數(shù)與多態(tài)
13.委托相關(guān)設(shè)計(jì)
14.復(fù)合&繼承關(guān)系下的構(gòu)造和析構(gòu)
注:部分筆記寫(xiě)在打印出的課件上,如下第三張圖片上的字
11.組合與繼承:
前兩周講的是單個(gè)類(lèi)的設(shè)計(jì),即基于對(duì)象編程
本周是講類(lèi)與類(lèi)之間的關(guān)系宗雇,即面向?qū)ο缶幊?
學(xué)習(xí)類(lèi)與類(lèi)之間的關(guān)系碉京,我們只需要了解以下三種關(guān)系即可:
先找最簡(jiǎn)單的來(lái)講:
初學(xué)者可能不習(xí)慣看上面的,現(xiàn)在把deque替換進(jìn)去:
queue中含有deque处硬,即queue和deque是復(fù)合關(guān)系霉咨。(即只要A含有B蛙紫,則就是一種復(fù)合關(guān)系)。但看代碼躯护,queue中的功能惊来,都由dequeue完成。Dequeu的功能比較強(qiáng)大棺滞,此例子比較特殊裁蚁,是一種Adapter(改造)模式(設(shè)計(jì)模式一種)。
從內(nèi)存角度分析上例:
復(fù)合關(guān)系下的構(gòu)造和析構(gòu):
構(gòu)造继准,由內(nèi)而外枉证! 析構(gòu),由外而內(nèi)移必!
編譯器會(huì)自己去構(gòu)造Component對(duì)象
container的構(gòu)造函數(shù)首先調(diào)用component的default構(gòu)造函數(shù)
Container的析構(gòu)先調(diào)用自己室谚,然后再調(diào)用Component的析構(gòu)函數(shù)(編譯器幫助完成,我們只要管理好Container的構(gòu)造和析構(gòu)就可以)
Delegation委托:
一種微弱的組合關(guān)系崔泵,不是含有component秒赤,而是含有component的指針
左邊是接口,右邊是具體實(shí)現(xiàn)
詳細(xì)筆記請(qǐng)看照片上的文字
繼承觀念:父類(lèi)的數(shù)據(jù)是被完整繼承下來(lái)的
繼承有三種方式憎瘸,public入篮,protected,private繼承幌甘。最常用的public繼承潮售,是說(shuō)is-a關(guān)系(不要認(rèn)為深?yuàn)W,is a就是說(shuō)明其是一種類(lèi)型)锅风。
繼承關(guān)系下的構(gòu)造和析構(gòu):
析構(gòu)由內(nèi)而外才堅(jiān)固
析構(gòu)右外而內(nèi)才穩(wěn)定
12.虛函數(shù)與多態(tài):
筆記都在圖上了:
繼承搭配上虛函數(shù)才可以強(qiáng)而有力
1.子類(lèi)可以繼承父類(lèi)的所有內(nèi)容酥诽,包括數(shù)據(jù)和函數(shù)。
2.從內(nèi)存角度皱埠,可以繼承數(shù)據(jù)
3.對(duì)于函數(shù)肮帐,不能從內(nèi)存角度理解,而是子類(lèi)繼承了父類(lèi)的函數(shù)調(diào)用權(quán)边器。
有虛函數(shù)的繼承:
實(shí)現(xiàn)上圖的代碼:
繼承關(guān)系下的構(gòu)造和析構(gòu):
同樣泪姨,構(gòu)造由內(nèi)而外。
Derived的構(gòu)造函數(shù)首先調(diào)用Base的default構(gòu)造函數(shù)饰抒,然后調(diào)用Component的default構(gòu)造函數(shù)肮砾,然后才執(zhí)行自己。
析構(gòu)由外而內(nèi)袋坑。
Derived的析構(gòu)函數(shù)首先執(zhí)行自己仗处,然后調(diào)用Component的析構(gòu)函數(shù),然后調(diào)用Base的析構(gòu)函數(shù)
重點(diǎn)內(nèi)容
看看下圖用到了什么:
上圖用到了委托和繼承組合:
1.委托和繼承組合是組合中最強(qiáng)大的一種
2.父類(lèi)Observer用來(lái)觀察左邊枣宫,左邊有使用到C++容器婆誓,并且有遍歷所有觀察者的動(dòng)作。
13.委托相關(guān)設(shè)計(jì):
設(shè)計(jì)模式之composite:
設(shè)計(jì)模式較復(fù)雜也颤,請(qǐng)看照片上筆記吧
設(shè)計(jì)模式之Prototype:
Prototype父類(lèi)代碼:
Prototype子類(lèi)代碼:
14.復(fù)合&繼承關(guān)系下的構(gòu)造和析構(gòu):
繼承關(guān)系下的構(gòu)造和析構(gòu):
構(gòu)造由內(nèi)而外洋幻,析構(gòu)由外而內(nèi)
注意:紅色的代碼是編譯器替我們加的,不用自己編寫(xiě)翅娶。
復(fù)合關(guān)系下的構(gòu)造和析構(gòu):
同樣文留,構(gòu)造由內(nèi)而外好唯,析構(gòu)由外而內(nèi)
繼承&復(fù)合關(guān)系下的構(gòu)造和析構(gòu):
仍然,構(gòu)造由內(nèi)而外燥翅,析構(gòu)由外而內(nèi)
大部分編譯器骑篙,構(gòu)造時(shí)先調(diào)用父類(lèi)的構(gòu)造函數(shù),再調(diào)用復(fù)合成分的森书;析構(gòu)時(shí)次序相反靶端。
拓展:
面向?qū)ο缶幊袒谌齻€(gè)基本概念:
1.數(shù)據(jù)抽象-類(lèi)
2.繼承-基類(lèi)/派生類(lèi)
3.動(dòng)態(tài)綁定-基類(lèi)的函數(shù)or派生類(lèi)的函數(shù)
面向?qū)ο缶幊谈攀觯?/p>
1.面向?qū)ο缶幊痰年P(guān)鍵思想是多態(tài)性(polymorphism)。多態(tài)性派生于一個(gè)希臘單詞凛膏,意思是“許多形態(tài)”杨名,之所以稱(chēng)通過(guò)繼承而相關(guān)聯(lián)的類(lèi)型為多態(tài)類(lèi)型,是因?yàn)樵谠S多情況下可以互換地使用派生類(lèi)型或基類(lèi)型的“許多形態(tài)”猖毫。在C++中台谍,多態(tài)性僅用于通過(guò)繼承而相關(guān)聯(lián)的類(lèi)型的引用或指針。
2.在C++中鄙麦,基類(lèi)必須指出希望派生類(lèi)重寫(xiě)哪些函數(shù)典唇,定義為virtual的函數(shù)是基類(lèi)期待派生類(lèi)重新定義的,基類(lèi)希望派生類(lèi)繼承的函數(shù)不能定義為虛函數(shù)胯府。
3.在C++中介衔,通過(guò)基類(lèi)的引用(或指針)調(diào)用虛函數(shù)時(shí),發(fā)生動(dòng)態(tài)綁定骂因。引用(或指針)既可以指向基類(lèi)對(duì)象也可以指向派生類(lèi)對(duì)象炎咖,這一事實(shí)是動(dòng)態(tài)綁定的關(guān)鍵。用引用(或指針)調(diào)用的虛函數(shù)在運(yùn)行時(shí)確定寒波,被調(diào)用的函數(shù)是引用(或指針)所指對(duì)象的實(shí)際類(lèi)型所定義的乘盼。
4.引用和指針的靜態(tài)類(lèi)型與動(dòng)態(tài)類(lèi)型可以不同,這是 C++ 用以支持多態(tài)性的基石俄烁。
詳請(qǐng)參考C++Prime 面向?qū)ο缶幊陶鹿?jié) 謝謝