1. 程式人生 > >繼承和面向對象設計

繼承和面向對象設計

缺省參數 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"的兩相組合.

繼承和面向對象設計