類(lèi)間關(guān)系:組合/委托/繼承
Composition 組合(has-a)
- Container has a Component: Component 類(lèi) 功能很全面,Container 類(lèi)根據(jù)需要設(shè)計(jì)對(duì)外接口,實(shí)現(xiàn)全部在 Component 類(lèi)中。

Composition
- 內(nèi)存:Container 對(duì)象的內(nèi)存中,包含一塊 Component 的內(nèi)存; 由內(nèi)而外構(gòu)造,由外而內(nèi)析構(gòu).

Composition memory
Delegation 委托(Composition by reference)
- Handle reference Body:所有實(shí)現(xiàn)都在 Body 類(lèi)中完成;Handle 根據(jù)需要設(shè)計(jì)對(duì)外接口,通過(guò)調(diào)用 Body 的方法實(shí)現(xiàn)

Delegation
- 內(nèi)存分布:Handle 類(lèi)有一塊內(nèi)存,存放 Body 類(lèi)對(duì)象的內(nèi)存地址

Delegation memory
- Delegation 的優(yōu)點(diǎn):
- 信息隱藏
包含 Handle 類(lèi)所在的頭文件,不僅成員函數(shù)實(shí)現(xiàn)不可見(jiàn),類(lèi)中實(shí)際的數(shù)據(jù)成員也不可見(jiàn),很好的實(shí)現(xiàn)了信息隱藏。 - 編譯防火墻
修改 Body 類(lèi),包含 Handle 類(lèi)頭文件的所有源文件都不需要重新編譯,只需要編譯 Body 類(lèi)所在的源文件。在大工程中,可以有效的減少編譯時(shí)間。 - Copy on write
Body 類(lèi)增加引用計(jì)數(shù)字段,多個(gè) Handle 類(lèi)的對(duì)象可以引用同一個(gè) Body 對(duì)象,某個(gè) Handle 對(duì)象需要改變 Body 對(duì)象的數(shù)據(jù)成員時(shí),Copy 一份副本供其修改。如果類(lèi) size 很大,可以減少內(nèi)存使用。
- 信息隱藏
Inheritance 繼承(is-a)
- 內(nèi)存分布:子類(lèi)對(duì)象的內(nèi)存中,包含一塊父類(lèi)對(duì)象;由內(nèi)而外構(gòu)造,由外而內(nèi)析構(gòu)

Inheritance

Inheritance memory
- 哪些成員可以被繼承?哪些不能繼承?
- 數(shù)據(jù)成員都被繼承
- 友元關(guān)系不能繼承
- 非虛成員函數(shù)。子類(lèi)可以覆寫(xiě)(override)
- 虛函數(shù),子類(lèi)可以重寫(xiě)
- 純虛函數(shù),子類(lèi)必須實(shí)現(xiàn) (父類(lèi)可以定義)
- 價(jià)值在于,與虛函數(shù)搭配使用,實(shí)現(xiàn)多態(tài)
Inheritance with virtual
- Template Method:父類(lèi)的成員函數(shù)實(shí)現(xiàn)應(yīng)用程序框架(處理流程),將子類(lèi)中不同的步驟定義為虛函數(shù),子類(lèi)重寫(xiě)。
- 優(yōu)點(diǎn):代碼重用,子類(lèi)只需要實(shí)現(xiàn)與父類(lèi)不同的部分,其他部分可以使用父類(lèi)的實(shí)現(xiàn)。
Inheritance + Composition
- Observer:解決一份數(shù)據(jù)多種表現(xiàn)形式問(wèn)題。
- Composite:嵌套 has-a 的形式。
- Prototype:框架已經(jīng)寫(xiě)好,框架中會(huì)創(chuàng)建子類(lèi)對(duì)象,但是未知子類(lèi)可能很長(zhǎng)時(shí)間以后才會(huì)定義。