繼承與面向?qū)ο笤O(shè)計(jì)
- 條款 32 - 確定你的 public 塑模出 is-a 關(guān)系
- "public繼承" 意味 is-a渴频。適用于 base classes 身上的每一件事情也一定適用于 derived classes 身上,因?yàn)槊恳粋€(gè) derived classes 對象也都是一個(gè) base classes 對象潜腻。
- 條款 33 - 避免遮掩繼承而來的名稱
- derived classes 內(nèi)的名稱會(huì)遮掩 base classes 內(nèi)的名稱棺禾,在 public 繼承下,從未有人希望如此。
- 為了讓遮掩的名稱再見天日秕岛,可使用 using 聲明式或轉(zhuǎn)交函數(shù)。
- 條款 34 - 區(qū)分接口繼承和實(shí)現(xiàn)繼承
- 接口繼承與實(shí)現(xiàn)繼承不同,在 public 繼承之下继薛, derived classes 總是繼承 base classes 的接口修壕。
- pure virtual 函數(shù)只具體指定接口繼承。
- 簡樸的 impure virtual 函數(shù)具體指定接口繼承及缺省實(shí)現(xiàn)繼承遏考。
- non-virtual 函數(shù)具體指定接口繼承及強(qiáng)制性實(shí)現(xiàn)繼承慈鸠。
- 條款 35 - 考慮 virtual 函數(shù)以外的其它選擇
- virtual 函數(shù)的替代方案包括 NVI 手法以及 Strategy 設(shè)計(jì)模式的多種形式,NVI 手法自身是一個(gè)特殊形式的 Template Method 設(shè)計(jì)模式灌具。
- 將機(jī)能從成員函數(shù)移到 class 外部函數(shù)青团,帶來的一個(gè)缺點(diǎn)是非成員函數(shù)無法訪問 class 的 non-public 成員。
- tr1::function 對象的行為就像一般函數(shù)指針稽亏,這樣的對象可接納與給定之目標(biāo)簽名式兼容的所有可調(diào)用物壶冒。
- 條款 36 - 決不重新定義繼承而來的 non-virtual 函數(shù)
- 絕對不要重新定義繼承而來的 non-virtual 函數(shù)
- 條款 37 - 決不重新定義繼承而來的缺省函數(shù)參數(shù)值
- 絕對不要重新定義一個(gè)繼承而來的缺省參數(shù)值,因?yàn)槿笔?shù)值都是靜態(tài)綁定的截歉,而 virtual 函數(shù)——你唯一需要復(fù)寫的東西——卻是動(dòng)態(tài)綁定的
- 條款 38 - 通過復(fù)合塑模出 has-a 或根據(jù)某物實(shí)現(xiàn)出
- 復(fù)合的意義和 public 繼承完全不同
- 在應(yīng)用域胖腾,復(fù)合意味 has-a,在實(shí)現(xiàn)域瘪松,復(fù)合意味 is-implemented-in-term-of
- 條款 39 - 明智而審慎地使用 private 繼承
- private 繼承意味 is-implemented-in-terms-of咸作,它通常比復(fù)合的級別低,但是當(dāng) derived class 需要訪問 protected base class 的成員宵睦,或需要重新定義繼承而來的 virtual 函數(shù)時(shí)记罚,這么設(shè)計(jì)是合理的。
- 和復(fù)合不同壳嚎,private 繼承可以造成 empty base 最優(yōu)化桐智,這對致力于 “對象尺寸最小化” 程序庫的開發(fā)者而言,可能很重要烟馅。
- 條款 40 - 明智而審慎地使用多重繼承
- 多重繼承比單一繼承復(fù)雜说庭,它可能導(dǎo)致新的岐義性,以及對 virtual 繼承的需要郑趁。
- virtual 繼承會(huì)增加大小刊驴、速度、初始化復(fù)雜度等等成本寡润。如果 virtual base class 不帶任何數(shù)據(jù)捆憎,將是最具實(shí)用價(jià)值的情況。
- 多重繼承的確有正當(dāng)用途梭纹,其中一個(gè)情節(jié)涉及 “public 繼承某個(gè) Interface class” 和 “private 繼承某個(gè)協(xié)助實(shí)現(xiàn)的 class” 的兩者相結(jié)合躲惰。