繼承和面向對象設計
阿新 • • 發佈:2018-12-22
缺省參數 eth func 意義 缺點 無法 應該 數值 重要
繼承與面向對象設計
32. 確定你的public繼承塑模出is-a關系
- "public繼承"意味is-a.適用於base classes身上的每一件事情一定也適用於derived classes身上,因為每一個derived class對象也都是一個base class對象
33. 避免遮掩繼承而來的名稱
- derived classes 內的名稱會遮掩base classes 內的名稱.在public繼承下從來沒有人希望如此.
- 為了讓被遮掩的名稱再見天日,可使用using 聲明式或轉交(forwardign functions).
34. 區別接口繼承和實現繼承
- 接口繼承和實現繼承不同.在public繼承之下,derived classes 總得繼承base class的接口.
- pure virtual函數只具體指定接口繼承
- 簡樸的(非純)impure virtual 函數集體指定接口繼承集缺省實現繼承
- non-virtual 函數具體指定接口繼承以及強制性實現繼承
35. 考慮virtual函數以外的其他選擇
- virtual 函數的替代方案包括NVI手法及Strategy設計模式的多種形式.NVI手法自身是一個特殊形式的Template Method設計模式.
- 將機能從成員函數移到class外部函數,帶來一個缺點是,非成員函數無法訪問class 的non-public成員
- trl::function 對象的行為就像一般函數指針.這樣的對象可接納"與給定之目標簽名式(target signature)兼容"的所有可調用物(callable entities).
36.絕不重新定義繼承而來的non-virtual函數
- 絕對不要重新定義繼承而來的non-virtual函數
37.絕不重新定義繼承而來的缺省參數值
- 絕對不要重新定義一個繼承而來的缺省參數值,因為缺省參數值都是靜態綁定,而virtual函數--你唯一應該覆寫的東西--卻是動態綁定
38.通過復合塑模出has-a 或"根據某物實現出"
- 復合(composition)的意義和public繼承完全不同
- 在應用域(application domain),復合意味著has-a(有一個).在實現域(implementation domain),復合意味is-implemented-in-terms-of(根據某物實現出)
39. 明智而審慎地使用private 繼承
- private 繼承意味is-implemented-in-terms-of (根據某物實現出).它通過比復合(composition)的級別低.但是當derived class需要訪問protected base class的成員,或需要重新定義繼承而來的virtual函數時,這麽設計是合理的.
- 和復合(composition)不同,private 繼承可以造成empty base 最優化.這對致力於"對象尺寸最小化"的程序庫開發者而言,可能很重要
40. 明智而審慎地使用多重繼承
多重繼承比單一繼承復雜.它可能導致新的歧義性,以及對virtual繼承的需要
virtual 繼承會增加大小,速度,初始化(及賦值)復雜度等等成本.如果virtual base classes 不帶任何數據,將是最具實用價值的情況
多重繼承的確與正當用途.其中一個情節設計"public 繼承某個Interface class"和"private 繼承某個協助實現的class"的兩相組合.
繼承和面向對象設計