Boolan C++面向對象高級編程(上)第三周

十一、繼承與組合

1.面向對象編程

2.復合(composition)

(1)表示has-a

(2)Adapter設計模式

queue

deque

(3)composition關系下的構造和析構

Container->Component

構造由內而外

Container的構造函數首先調用component的default構造函數然后才執行自己。

Container::Container(..):Component(){…};

析構由外而內

Container的析構函數首先執行自己,然后才調用Component的析構函數。

Container::~Container(..){…Component()};

紅色部分是編譯器加的。

3.委托(Delegation)

(1)Composition by reference

指針指向

對象的創建不同步

(2)pimpl(Handle/Body)

指針可以指向不同的實現類

編譯防火墻(左邊不用再編譯,只用編譯右邊)

Reference counting共享

Copy on write

4.繼承(Inheritance)

(1)表示is-a

三種繼承方式:最有用的是public

(2)繼承關系下的構造和析構

Derived->Base

子類的對象有父類的成分

Base class的dtor必須是virtual,否則會出現undefined behavior。

構造由內而外

Derived的構造函數首先調用Base的default構造函數,然后才執行自己。

Derived::Derived(..):Base(){…};

析構由外而內

Derived的析構函數首先執行自己,然后才調用Base的析構函數。

Derived::~Derived(..){…Base()};

十二、虛函數與多態

1.Virtual

子類繼承父類:

繼承父類的數據:占用了內存一部分。

繼承父類的函數:不從內存角度理解,繼承的是調用權,子類可以調用父類的函數。

父類三種函數

Non-virtual函數:你不希望derived class重新定義(override,復寫)它。

Virtual函數:你希望derived clss重新定義(override,復寫)它,且你對它已有默認定義。

Pure virtual函數:你希望derived clss一定重新定義(override,復寫)它,你對它沒有默認定義。(其實可以有定義?)

2.Template method

繼承with虛函數的一個重要用途:Template method

應用程序框架中,經常用到Template method(模板方法模式,一種設計模式)。

3.inheritance和composition關系下的構造和析構

父類和component的構造誰先誰后?

?

?

4.Delegation+inheritance

觀察者模式。

十三、委托相關設計

1.Delegation+inheritance

Composite設計模式

?

2.Delegation+inheritance

Prototype

現在要去創建未來的class,怎么辦?

子類自己創建自己

不用clone,用靜態函數

靜態函數需要class name,但是未來的class不知道class name

Class內部的static成員變量需要在外面定義。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容