類間關(guān)系:組合/委托/繼承
Composition 組合(has-a)
- Container has a Component: Component 類 功能很全面脆诉,Container 類根據(jù)需要設(shè)計(jì)對外接口挣跋,實(shí)現(xiàn)全部在 Component 類中仅政。
- 內(nèi)存:Container 對象的內(nèi)存中,包含一塊 Component 的內(nèi)存; 由內(nèi)而外構(gòu)造谷饿,由外而內(nèi)析構(gòu).
Delegation 委托(Composition by reference)
- Handle reference Body:所有實(shí)現(xiàn)都在 Body 類中完成荧降;Handle 根據(jù)需要設(shè)計(jì)對外接口,通過調(diào)用 Body 的方法實(shí)現(xiàn)
- 內(nèi)存分布:Handle 類有一塊內(nèi)存及志,存放 Body 類對象的內(nèi)存地址
- Delegation 的優(yōu)點(diǎn):
- 信息隱藏
包含 Handle 類所在的頭文件片排,不僅成員函數(shù)實(shí)現(xiàn)不可見,類中實(shí)際的數(shù)據(jù)成員也不可見速侈,很好的實(shí)現(xiàn)了信息隱藏率寡。 - 編譯防火墻
修改 Body 類,包含 Handle 類頭文件的所有源文件都不需要重新編譯倚搬,只需要編譯 Body 類所在的源文件冶共。在大工程中,可以有效的減少編譯時間每界。 - Copy on write
Body 類增加引用計(jì)數(shù)字段捅僵,多個 Handle 類的對象可以引用同一個 Body 對象,某個 Handle 對象需要改變 Body 對象的數(shù)據(jù)成員時眨层,Copy 一份副本供其修改命咐。如果類 size 很大,可以減少內(nèi)存使用谐岁。
- 信息隱藏
Inheritance 繼承(is-a)
- 內(nèi)存分布:子類對象的內(nèi)存中,包含一塊父類對象;由內(nèi)而外構(gòu)造伊佃,由外而內(nèi)析構(gòu)
- 哪些成員可以被繼承窜司?哪些不能繼承?
- 數(shù)據(jù)成員都被繼承
- 友元關(guān)系不能繼承
- 非虛成員函數(shù)航揉。子類可以覆寫(override)
- 虛函數(shù)塞祈,子類可以重寫
- 純虛函數(shù),子類必須實(shí)現(xiàn) (父類可以定義)
- 價值在于帅涂,與虛函數(shù)搭配使用议薪,實(shí)現(xiàn)多態(tài)
Inheritance with virtual
- Template Method:父類的成員函數(shù)實(shí)現(xiàn)應(yīng)用程序框架(處理流程),將子類中不同的步驟定義為虛函數(shù)媳友,子類重寫斯议。
- 優(yōu)點(diǎn):代碼重用,子類只需要實(shí)現(xiàn)與父類不同的部分醇锚,其他部分可以使用父類的實(shí)現(xiàn)哼御。
Inheritance + Composition
- Observer:解決一份數(shù)據(jù)多種表現(xiàn)形式問題。
- Composite:嵌套 has-a 的形式焊唬。
- Prototype:框架已經(jīng)寫好恋昼,框架中會創(chuàng)建子類對象,但是未知子類可能很長時間以后才會定義赶促。