博覽網(wǎng)學習筆記:
第三周課程的知識點:
11.組合與繼承
注意:前兩周講的是單個類的設計赃泡,即基于對象編程。
本周是講類與類之間的關系板壮,即面向?qū)ο缶幊獭?/p>
類與類的三種關系:
1.復合composition
1)我們舉例來解釋復合:
我們新建一個類queue夺巩,queue中含有deque具练,因deque功能強大乍构,queue使用的功能,即queue包含deque的功能扛点,我們稱之為復合關系哥遮。(即只要A含有B,則就是一種復合關系)陵究。次例中queue功能都由deque實現(xiàn)眠饮。
其關系可用下圖表示:
2)復合的關系下的構造與析構:
上圖也可表示為:
構造函數(shù)由由內(nèi)(component)而外(container)!
container的構造函數(shù)首先調(diào)用component的默認的構造函數(shù)畔乙,然后執(zhí)行自己的構造函數(shù)君仆。(這部分知識,我么只需要了解即可牲距。編譯器會自動幫助我們正確調(diào)用函數(shù))
析構返咱,由外(container)而內(nèi)(component)!
container的析構函數(shù)首先執(zhí)行自己的析構函數(shù)牍鞠,然后調(diào)用component的析構函數(shù)咖摹。(若先執(zhí)行component的析構函數(shù),則內(nèi)部崩塌难述,編譯器報錯)
2.委托delegation
1)一種特殊的復合關系萤晴,不是含有component吐句,而是含有component的指針。
2)表示為:
3.繼承inheritance
1)舉例:
class a
{
........
}
class b:public a {}店读;
即類b繼承類a中的功能嗦枢,或者說類b是一種類a(子類b中有父類a的成分)。
2)表示為
注意:父類的析構函數(shù)必須是虛函數(shù)屯断,否則會報錯
3)構造與析構函數(shù)的執(zhí)行順序:
構造函數(shù)由內(nèi)而外:
子類文虏,也即衍生類(derived)的構造函數(shù)先調(diào)用父類(base)的默認構造函數(shù),然后執(zhí)行自己的殖演;
析構由內(nèi)外而內(nèi):
子類先執(zhí)行自己的析構函數(shù)氧秘,然后才調(diào)用父類的析構函數(shù);
12.虛函數(shù)與多態(tài)
1.初識虛函數(shù):
非虛函數(shù)(non-virtual):不希望子類重新定義(override)這個函數(shù)趴久;
虛函數(shù)(virtual):希望子類重新定義(override)這個函數(shù)丸相,且父類以對其進行默認定義,但子類不是必須定義這個函數(shù)彼棍;
純虛函數(shù)(pure virtual):希望子類一定重新定義(override)這個函數(shù)灭忠;對其沒有默認定義,例:virtual void draw()const=0座硕;
2.繼承搭配上虛函數(shù)才可以強而有力
1).子類可以繼承父類的所有內(nèi)容更舞,包括數(shù)據(jù)和函數(shù)。
2).從內(nèi)存角度坎吻,可以繼承數(shù)據(jù)
3).對于函數(shù),不能從內(nèi)存角度理解宇葱,而是子類繼承了父類的函數(shù)調(diào)用權瘦真。
13.委托相關設計
設計模式之composite:
以file system為例:
設計模式之Prototype,筆記見下圖: