十一、繼承與組合
1.面向對象編程
2.復合(composition)
(1)表示has-a
(2)Adapter設計模式
queue
deque
(3)composition關系下的構造和析構
Container->Component
構造由內而外
Container的構造函數首先調用component的default構造函數然后才執行自己。
Container::Container(..):Component(){…};
析構由外而內
Container的析構函數首先執行自己,然后才調用Component的析構函數。
Container::~Container(..){…Component()};
紅色部分是編譯器加的。
3.委托(Delegation)
(1)Composition by reference
指針指向
對象的創建不同步
(2)pimpl(Handle/Body)
指針可以指向不同的實現類
編譯防火墻(左邊不用再編譯,只用編譯右邊)
Reference counting共享
Copy on write
4.繼承(Inheritance)
(1)表示is-a
三種繼承方式:最有用的是public
(2)繼承關系下的構造和析構
Derived->Base
子類的對象有父類的成分
Base class的dtor必須是virtual,否則會出現undefined behavior。
構造由內而外
Derived的構造函數首先調用Base的default構造函數,然后才執行自己。
Derived::Derived(..):Base(){…};
析構由外而內
Derived的析構函數首先執行自己,然后才調用Base的析構函數。
Derived::~Derived(..){…Base()};
十二、虛函數與多態
1.Virtual
子類繼承父類:
繼承父類的數據:占用了內存一部分。
繼承父類的函數:不從內存角度理解,繼承的是調用權,子類可以調用父類的函數。
父類三種函數
Non-virtual函數:你不希望derived class重新定義(override,復寫)它。
Virtual函數:你希望derived clss重新定義(override,復寫)它,且你對它已有默認定義。
Pure virtual函數:你希望derived clss一定重新定義(override,復寫)它,你對它沒有默認定義。(其實可以有定義?)
2.Template method
繼承with虛函數的一個重要用途:Template method
應用程序框架中,經常用到Template method(模板方法模式,一種設計模式)。
3.inheritance和composition關系下的構造和析構
父類和component的構造誰先誰后?
?
?
4.Delegation+inheritance
觀察者模式。
十三、委托相關設計
1.Delegation+inheritance
Composite設計模式
?
2.Delegation+inheritance
Prototype
現在要去創建未來的class,怎么辦?
子類自己創建自己
不用clone,用靜態函數
靜態函數需要class name,但是未來的class不知道class name
Class內部的static成員變量需要在外面定義。