C++面向對象高級編程(侯捷)—— 11&12.繼承 & 複合 & 委託 & 虛函數與多態 & 委託相關設計

Object Oriented Programming(OOP), Object Oriented Design (OOD)

Inheritance (繼承),表示 is-a

  • struct也是一種class
  • 父類的成員,子類可以繼承

  • 構造和析構
    • 構造:先父類(默認構造函數)後子類
    • 析構:先子類後父類析構函數
      • 父類析構必須時virtual,否則會出現undefined behavior
      • 編寫class時,當該類可能會稱爲父類,就要把析構函數寫成virtual(好習慣)
  • with virtual functions (虛函數) ps. 函數的繼承是指調用權
    • non-virtual 非虛函數:子類不可以重新定義(override,覆寫)
    • virtual 虛函數:子類可以重新定義(override),父類中已有默認定義
    • pure virtual 純虛函數:子類必須重新定義(override),父類沒定義
class Shape {
public:
    virtual void draw( ) const = 0; // pure virtual
    virtual void error(const std::string& msg); // impure virtual
    int objectID( ) const; // non-virtual
    ...
};

class Rectangle: public Shape { ... };
class Ellipse: public Shape { ... };
  •  Inheritance (繼承) with virtual

Composition(複合),表示 has-a

  • 複合 可以表示爲 has-a 的關係,queue中有一個deque<T>
  • 用圖表示類之間的關係,實心的菱形
  • 傳統c語言的struct也存在這種關係

  • 求sizeof 

  • 複合關係下的構造和析構 
    • 構造由內而外
    • 析構由外而內
    • 不滿意編譯器調用默認構造函數,就要自己再同樣的未知寫清楚調用哪個。

Delegation(委託)Composition by reference (其實就是pointer)

  • 相比上一個複合,委託是裏面有一個其他類的指針(對應的對象和內存等到需要的時候才創建,不一定要在構造函數直接創建)
  • 圖的話,用空心的菱形表示
  • 委託相比複合

  • 補充一個彈幕的小問題:傳參的時候,引用&和指針*的區別
    • &類似一個不能改變指向的地址,相當於 T* const,所以&是類型安全的,而*不是;
      • 可以用 const T* const 達到 const T&的目的 (沒有T& const a這種形式)
      • &只能在定義時被初始化一次,之後不可變;*可變
    • &用.來調用,*用->來調用
    • *是一個實體,&僅僅是別名(不佔內存)
    • &不能爲空,*可以爲空
    • sizeof中:&得到對應類型的大小,*得到指針的大小
    • 自增(++)運算意義不一樣

繼承 Inheritance + 複合 Composition 情況下的 構造和析構 的先後順序

(課後作業)

委託 Delegation + 繼承 Inheritance :實例

設計模式的書:design pattern explained simply 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章