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中:&得到對應類型的大小,*得到指針的大小
- 自增(++)運算意義不一樣
- &類似一個不能改變指向的地址,相當於 T* const,所以&是類型安全的,而*不是;
繼承 Inheritance + 複合 Composition 情況下的 構造和析構 的先後順序
(課後作業)
委託 Delegation + 繼承 Inheritance :實例
設計模式的書:design pattern explained simply