本文預(yù)覽:
OOP(面向?qū)ο缶幊?不是只有繼承這一種關(guān)系肯适,還包括組合和委托变秦,雖然這兩種關(guān)系非常簡單,委托的另一個別名叫做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)系的類大小的計算:
- 組合關(guān)系的構(gòu)造與析構(gòu)
構(gòu)造函數(shù)順序是先構(gòu)造component,再構(gòu)造自己纬凤;
析構(gòu)函數(shù)剛好相反福贞,先析構(gòu)自己,然后在析構(gòu)component停士。
委托(Delagation)挖帘, Composition by reference
類里面明明是個指針完丽,非要寫成是 by reference, 只是個叫法的問題吧,c++好像很少用 by pointer的說法拇舀,reference尤其是參數(shù)傳遞和返回值的時候最常用逻族。
String現(xiàn)在的實(shí)現(xiàn)完全交付給StringRep來實(shí)現(xiàn),并且骄崩,不像Composition那樣聘鳞,生命周期是一致的,現(xiàn)在String和StringRep的生命周期就不再一致要拂。這種設(shè)計的一個用處在于搁痛,String對外提供的接口使用是不變的,但是內(nèi)部實(shí)現(xiàn)是可以更換的宇弛;還有引入reference counting,效率豈不是比起來char*快更多倍源请,尤其是在不需要改變的字符串常亮枪芒。
繼承(Inheritance),表示 is-a
繼承是面向?qū)ο缶幊痰暮诵牟糠炙瑥膬?nèi)存的角度上講舅踪,子類擁有父類的成員變量,對于成員函數(shù)來說良蛮,繼承代表子類擁有函數(shù)的調(diào)用權(quán)
- 繼承的語法
- 繼承下的構(gòu)造和析構(gòu)
有兩點(diǎn)是需要注意的吧:
- 構(gòu)造和析構(gòu)的順序抽碌,這些都是編譯器自動調(diào)用的,紅色部分標(biāo)記的位置决瞳;
- 父類的析構(gòu)函數(shù)一定設(shè)計成是虛函數(shù)货徙。
- 繼承和虛函數(shù)
三個非常重要的函數(shù)
- 非虛函數(shù): 不希望子類重新定義
- 虛函數(shù):希望子類重新定義,并且自己有默認(rèn)定義
- 純虛函數(shù):子類一定要重新定義皮胡,自己沒默認(rèn)定義
- 虛函數(shù)最常見且重要的應(yīng)用領(lǐng)域:Template Method
子類調(diào)用父類的函數(shù)痴颊,父類延緩實(shí)現(xiàn)Serialize()方法,交由子類來實(shí)現(xiàn)屡贺,在調(diào)用的時候蠢棱,執(zhí)行子類的方法。
Template Method 常常用在框架的設(shè)計甩栈,具體實(shí)現(xiàn)由誰來寫都是一樣的泻仙,但是必須按照這種框架來實(shí)現(xiàn)。