C++類與類之間的關(guān)系


本文預(yù)覽:
OOP(面向?qū)ο缶幊?不是只有繼承這一種關(guān)系,還包括組合和委托,雖然這兩種關(guān)系非常簡單,委托的另一個(gè)別名叫做Composition by reference,兩者在形式上是非常相似的。

  • 組合(Composition)
  • 委托(Delagation)
  • 繼承(Inheritance)
  • 繼承下的構(gòu)造和析構(gòu)
  • 繼承與虛函數(shù)
  • 虛函數(shù)的重要應(yīng)用 Template Method

組合關(guān)系,表示has-a

  • deque是queue的成員,queue和deque是組合關(guān)系。組合關(guān)系的類大小的計(jì)算:
組合關(guān)系類大小的計(jì)算
  • 組合關(guān)系的構(gòu)造與析構(gòu)
    構(gòu)造函數(shù)順序是先構(gòu)造component,再構(gòu)造自己;
    析構(gòu)函數(shù)剛好相反,先析構(gòu)自己,然后在析構(gòu)component。
組合.png

委托(Delagation), Composition by reference

類里面明明是個(gè)指針,非要寫成是 by reference, 只是個(gè)叫法的問題吧,c++好像很少用 by pointer的說法,reference尤其是參數(shù)傳遞和返回值的時(shí)候最常用。

String現(xiàn)在的實(shí)現(xiàn)完全交付給StringRep來實(shí)現(xiàn),并且,不像Composition那樣,生命周期是一致的,現(xiàn)在String和StringRep的生命周期就不再一致。這種設(shè)計(jì)的一個(gè)用處在于,String對(duì)外提供的接口使用是不變的,但是內(nèi)部實(shí)現(xiàn)是可以更換的;還有引入reference counting,效率豈不是比起來char*快更多倍,尤其是在不需要改變的字符串常亮。

委托的典型設(shè)計(jì)

繼承(Inheritance),表示 is-a

繼承是面向?qū)ο缶幊痰暮诵牟糠郑瑥膬?nèi)存的角度上講,子類擁有父類的成員變量,對(duì)于成員函數(shù)來說,繼承代表子類擁有函數(shù)的調(diào)用權(quán)

  • 繼承的語法
繼承
  • 繼承下的構(gòu)造和析構(gòu)
    有兩點(diǎn)是需要注意的吧:
  1. 構(gòu)造和析構(gòu)的順序,這些都是編譯器自動(dòng)調(diào)用的,紅色部分標(biāo)記的位置;
  2. 父類的析構(gòu)函數(shù)一定設(shè)計(jì)成是虛函數(shù)。
構(gòu)造和析構(gòu)
  • 繼承和虛函數(shù)

三個(gè)非常重要的函數(shù)

  • 非虛函數(shù): 不希望子類重新定義
  • 虛函數(shù):希望子類重新定義,并且自己有默認(rèn)定義
  • 純虛函數(shù):子類一定要重新定義,自己沒默認(rèn)定義
虛函數(shù)
  • 虛函數(shù)最常見且重要的應(yīng)用領(lǐng)域:Template Method

子類調(diào)用父類的函數(shù),父類延緩實(shí)現(xiàn)Serialize()方法,交由子類來實(shí)現(xiàn),在調(diào)用的時(shí)候,執(zhí)行子類的方法。
Template Method 常常用在框架的設(shè)計(jì),具體實(shí)現(xiàn)由誰來寫都是一樣的,但是必須按照這種框架來實(shí)現(xiàn)。

子類調(diào)用父類的函數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容