C++學習(5)
組合與繼承
Composition組合,表示has a
queue只開放了deque的部分功能,adapter介面卡模式
組合之下的構造和析構
構造由內而外,先構建裡層一層一層構建
Container的建構函式首先呼叫Component的default建構函式,然後才執行自己
析構由外而內,先剝掉外層再一層一層往裡
Container的析構首先執行自己,然後才呼叫Component的解構函式。
注:以上紅色操作都由編譯器自動完成,這裡剖析其執行次序
Delegation(委託,聚合)Composition by reference
只有一個指標指向對方,但是什麼時候擁有它,看情況。
組合:有了外部就會有內部
聚合:有了外部,等需要內部的時候再去建立它
Handle/Body pimpl:所有的功能都由那個指標完成。
引用計數,共享記憶體,更改時複製一個副本,copy on write
Inheriance(繼承)表示is a
繼承關係下的構造和析構
base class的dtor必須是虛擬函式,否則會出現undefined behavior
構造由內而外
Derived的建構函式首先呼叫Base的default構造安徽省農戶然後才執行自己
析構由外而內
Derived的析構阿寒湖首先執行自己,然後才呼叫Base的解構函式
Inheritance繼承with virtual function虛擬函式
non-virtual 非虛擬函式:你不希望derived class重新定義(override,重寫)它
virtual 函式:你希望derived class重新定義它,並且你對它已經有預設定義
pure virtual函式:你希望derived class一定要重新定義它,你對它沒有預設定義
模板方法 Template Method
Inheritance_Composition關係下的構造和析構
Component先然後是Base
Delegation委託+Inheritance繼承 (觀察者模式)
一個有變化,大家都變化
Subject放資料
Observer觀察者
subject包含函式:attach 新增觀察者、notify通知觀察者
Observer可以被繼承:update接受通知後更新資料
委託的相關設計
Delegation(委託)+Inheritance(繼承)
組合模式
File系統
Primitive基本的個體
Composition是一個容器:可以放Primitive也可以放自己。
左右都繼承Component
Composite即可以包含左邊也可以包含右邊,所以直接將型別直接定義為其共同的父類。
組合模式:例如檔案系統:primitive類比於檔案,composite相當於資料夾裡面可以放檔案也可以放資料夾。
add函式定義成虛擬函式,primitive可以不要重新add
Prototype
現在的框架要去建立未來的class
static 自己創造自己的原型,而這個原型必須登記到父類中。static原型的作用是在再程式開始的時候就把自己註冊到父類中
靜態的自己被建立時會呼叫私有的建構函式(-LandSatImage()),私有的建構函式會呼叫addPrototype()會把自己掛載到父類的容器中。
子類應該有一個clone:作用可以複製自己。框架父類可以通過剛剛static的原型,呼叫clone() new自己。
new的時候一定不能再呼叫靜態的那個,所以作者將另一個建構函式加了一個引數。所以clone的時候呼叫的是有引數的那個建構函式。