第三周
Composition(復(fù)合),has-a
圖形表示,實(shí)心菱形
這里queue功能完全由deque包裝實(shí)現(xiàn)知举,是adapter設(shè)計(jì)模式唉匾。
內(nèi)存大小如下
Composition 復(fù)合關(guān)系下的構(gòu)造和析構(gòu)
構(gòu)造由內(nèi)而外
Container的構(gòu)造函數(shù)首先調(diào)用Component的默認(rèn)構(gòu)造函數(shù),然后才執(zhí)行自己涣易。
實(shí)際上編譯器類似如下操作:
Container::Container(...): Component() { ... };
析構(gòu)由外而內(nèi)
Container的析構(gòu)函數(shù)首先執(zhí)行自己篷角,然后才調(diào)用Component的析構(gòu)函數(shù)焊刹。
Container::~Container(...) {... ~Component( );}
Delegation(委托) Composition by reference
其中包含一個(gè)指針。用空心菱形塊表示。
很有名 Handle/Body pimpl: pointer to implementation
所有的實(shí)現(xiàn)都在右邊虐块,通過(guò)指針實(shí)現(xiàn)俩滥。好處是右邊的任何變動(dòng)不影響左邊。編譯防火墻贺奠。
共享
如果內(nèi)容一樣可以共享霜旧,使用引用計(jì)數(shù)器。其中一個(gè)的寫不能影響其他的儡率。
Inheritance (繼承) 挂据, is-a
子類指向父類,空心三角形喉悴。
Inheritance 繼承下的構(gòu)造和析構(gòu)
base class 的 dtor 必須是 virtual棱貌, 否則會(huì)出現(xiàn)undefined behavior
構(gòu)造由內(nèi)而外玖媚,析構(gòu)由外而內(nèi)
Derived::Derived(...) : Base( ) {...};
Derived::~Derived(...) { ... ~Base( ) };
Inheritance 繼承 with virtual functions (虛函數(shù))
繼承的函數(shù)實(shí)際上是繼承的函數(shù)調(diào)用權(quán)箕肃。
non-vitual 函數(shù):你不希望derived class重新定義(override,復(fù)寫)它今魔。
virtual 函數(shù):你希望derived class重新定義(override勺像,復(fù)寫)它,且你對(duì)它已有默認(rèn)定義错森。
pure virtual 函數(shù):你希望derived class一定要重新定義(override吟宦,復(fù)寫)它,你對(duì)它沒(méi)有默認(rèn)定義涩维。
Template Method
這里Serialize( )函數(shù)可以放到以后寫殃姓。MFC就是這樣。瓦阐。蜗侈。
Serialize使用this來(lái)調(diào)用。
Inheritance 和 Composition關(guān)系下的構(gòu)造和析構(gòu)函數(shù)
作業(yè) 看看誰(shuí)先誰(shuí)后
Delegation 委托 + Inheritance 繼承
可以做到類似如下效果
Subject里放的都是指針睡蟋,其余從Observer繼承踏幻。
Subject提供注冊(cè)和注銷的函數(shù),注冊(cè)即放到容器里戳杀。
Composite Composite容器 即要放Primitive 又要放 Composite该面,于是讓Primitive和Composite均繼承Component。
add函數(shù)不能寫純虛函數(shù)信卡,因?yàn)镻rimitive沒(méi)有add隔缀,繼承下來(lái)空函數(shù)。
Prototype 應(yīng)對(duì)以后出現(xiàn)的新類傍菇,讓下面派生的子類都創(chuàng)建一個(gè)自己蚕泽。
圖中下劃線代表靜態(tài),- 代表private #代表protected,名字在前须妻,類型在后仔蝌。
子類里有一個(gè)靜態(tài)的自己,如_LSAT荒吏。
子類構(gòu)造函數(shù)私有敛惊,將自己add到父類的容器中。
子類自己有clone函數(shù)绰更,new 自己瞧挤。
有兩個(gè)構(gòu)造函數(shù),當(dāng)clone時(shí)儡湾,同樣會(huì)創(chuàng)建自己特恬,調(diào)用構(gòu)造函數(shù),如果只有一個(gè)構(gòu)造函數(shù)徐钠,那么又會(huì)把自己add到父類的容器中癌刽,所以寫一個(gè)帶參數(shù)的構(gòu)造函數(shù),這個(gè)參數(shù)根本用不到尝丐。