博覽網學習筆記:
第三周課程的知識點:
11.組合與繼承
注意:前兩周講的是單個類的設計,即基于對象編程。
本周是講類與類之間的關系,即面向對象編程。
類與類的三種關系:
1.復合composition
1)我們舉例來解釋復合:
我們新建一個類queue,queue中含有deque,因deque功能強大,queue使用的功能,即queue包含deque的功能,我們稱之為復合關系。(即只要A含有B,則就是一種復合關系)。次例中queue功能都由deque實現。
其關系可用下圖表示:
2)復合的關系下的構造與析構:
上圖也可表示為:
構造函數由由內(component)而外(container)!
container的構造函數首先調用component的默認的構造函數,然后執行自己的構造函數。(這部分知識,我么只需要了解即可。編譯器會自動幫助我們正確調用函數)
析構,由外(container)而內(component)!
container的析構函數首先執行自己的析構函數,然后調用component的析構函數。(若先執行component的析構函數,則內部崩塌,編譯器報錯)
2.委托delegation
1)一種特殊的復合關系,不是含有component,而是含有component的指針。
2)表示為:
3.繼承inheritance
1)舉例:
class a
{
........
}
class b:public a {};
即類b繼承類a中的功能,或者說類b是一種類a(子類b中有父類a的成分)。
2)表示為
注意:父類的析構函數必須是虛函數,否則會報錯
3)構造與析構函數的執行順序:
構造函數由內而外:
子類,也即衍生類(derived)的構造函數先調用父類(base)的默認構造函數,然后執行自己的;
析構由內外而內:
子類先執行自己的析構函數,然后才調用父類的析構函數;
12.虛函數與多態
1.初識虛函數:
非虛函數(non-virtual):不希望子類重新定義(override)這個函數;
虛函數(virtual):希望子類重新定義(override)這個函數,且父類以對其進行默認定義,但子類不是必須定義這個函數;
純虛函數(pure virtual):希望子類一定重新定義(override)這個函數;對其沒有默認定義,例:virtual void draw()const=0;
2.繼承搭配上虛函數才可以強而有力
1).子類可以繼承父類的所有內容,包括數據和函數。
2).從內存角度,可以繼承數據
3).對于函數,不能從內存角度理解,而是子類繼承了父類的函數調用權。
13.委托相關設計
設計模式之composite:
以file system為例:
設計模式之Prototype,筆記見下圖: