第三周結構框圖:
11.組合與繼承
12.虛函數與多態
13.委托相關設計
14.復合&繼承關系下的構造和析構
注:部分筆記寫在打印出的課件上,如下第三張圖片上的字
11.組合與繼承:
前兩周講的是單個類的設計,即基于對象編程
本周是講類與類之間的關系,即面向對象編程
學習類與類之間的關系,我們只需要了解以下三種關系即可:
這里寫圖片描述
先找最簡單的來講:
這里寫圖片描述
初學者可能不習慣看上面的,現在把deque替換進去:
這里寫圖片描述
queue中含有deque,即queue和deque是復合關系。(即只要A含有B,則就是一種復合關系)。但看代碼,queue中的功能,都由dequeue完成。Dequeu的功能比較強大,此例子比較特殊,是一種Adapter(改造)模式(設計模式一種)。
從內存角度分析上例:
這里寫圖片描述
復合關系下的構造和析構:
這里寫圖片描述
構造,由內而外! 析構,由外而內!
編譯器會自己去構造Component對象
container的構造函數首先調用component的default構造函數
Container的析構先調用自己,然后再調用Component的析構函數(編譯器幫助完成,我們只要管理好Container的構造和析構就可以)
Delegation委托:
一種微弱的組合關系,不是含有component,而是含有component的指針
這里寫圖片描述
左邊是接口,右邊是具體實現
詳細筆記請看照片上的文字
這里寫圖片描述
繼承觀念:父類的數據是被完整繼承下來的
繼承有三種方式,public,protected,private繼承。最常用的public繼承,是說is-a關系(不要認為深奧,is a就是說明其是一種類型)。
繼承關系下的構造和析構:
這里寫圖片描述
析構由內而外才堅固
析構右外而內才穩定
12.虛函數與多態:
筆記都在圖上了:
這里寫圖片描述
繼承搭配上虛函數才可以強而有力
1.子類可以繼承父類的所有內容,包括數據和函數。
2.從內存角度,可以繼承數據
3.對于函數,不能從內存角度理解,而是子類繼承了父類的函數調用權。
有虛函數的繼承:
這里寫圖片描述
實現上圖的代碼:
這里寫圖片描述
繼承關系下的構造和析構:
這里寫圖片描述
同樣,構造由內而外。
Derived的構造函數首先調用Base的default構造函數,然后調用Component的default構造函數,然后才執行自己。
析構由外而內。
Derived的析構函數首先執行自己,然后調用Component的析構函數,然后調用Base的析構函數
重點內容
看看下圖用到了什么:
這里寫圖片描述
上圖用到了委托和繼承組合:
這里寫圖片描述
1.委托和繼承組合是組合中最強大的一種
2.父類Observer用來觀察左邊,左邊有使用到C++容器,并且有遍歷所有觀察者的動作。
13.委托相關設計:
設計模式之composite:
這里寫圖片描述
設計模式較復雜,請看照片上筆記吧
設計模式之Prototype:
這里寫圖片描述
Prototype父類代碼:
這里寫圖片描述
Prototype子類代碼:
這里寫圖片描述
14.復合&繼承關系下的構造和析構:
繼承關系下的構造和析構:
這里寫圖片描述
構造由內而外,析構由外而內
注意:紅色的代碼是編譯器替我們加的,不用自己編寫。
復合關系下的構造和析構:
這里寫圖片描述
同樣,構造由內而外,析構由外而內
繼承&復合關系下的構造和析構:
這里寫圖片描述
仍然,構造由內而外,析構由外而內
大部分編譯器,構造時先調用父類的構造函數,再調用復合成分的;析構時次序相反。
拓展:
面向對象編程基于三個基本概念:
1.數據抽象-類
2.繼承-基類/派生類
3.動態綁定-基類的函數or派生類的函數
面向對象編程概述:
1.面向對象編程的關鍵思想是多態性(polymorphism)。多態性派生于一個希臘單詞,意思是“許多形態”,之所以稱通過繼承而相關聯的類型為多態類型,是因為在許多情況下可以互換地使用派生類型或基類型的“許多形態”。在C++中,多態性僅用于通過繼承而相關聯的類型的引用或指針。
2.在C++中,基類必須指出希望派生類重寫哪些函數,定義為virtual的函數是基類期待派生類重新定義的,基類希望派生類繼承的函數不能定義為虛函數。
3.在C++中,通過基類的引用(或指針)調用虛函數時,發生動態綁定。引用(或指針)既可以指向基類對象也可以指向派生類對象,這一事實是動態綁定的關鍵。用引用(或指針)調用的虛函數在運行時確定,被調用的函數是引用(或指針)所指對象的實際類型所定義的。
4.引用和指針的靜態類型與動態類型可以不同,這是 C++ 用以支持多態性的基石。
詳請參考C++Prime 面向對象編程章節 謝謝