類與類之間三種主要關係
GeekBand 侯捷
1、Conposition(複合)has -a
典例:
複合的部分特點:
1、前者A擁有後者B,A中的所有功能都有B來做。
2、一般B的功能更加強大,一些功能“改頭換面”用來實現A的功能。
3、A與B緊密相連,生存期相同。
Composition(複合)語法:
Composition(複合)的圖形表現方式
黑色表示有東西,前者是容器,它容納了後者。
Composition(複合)的內存方式
直觀的理解如下:
上圖中,在創建dequee類型的c時,系統分配的空間爲40。
Composition(複合)關係下的構造和析構
需要說明的是,外部構造函數先調用內部構造函數,完後,再執行外部構造函數自己的剩餘部分。
而外部析構函數先析構自己的獨有的部分,完後,再執行內部析構函數。
2、Delegation(委託),Composition by reference(指針相連)
典例:
Delegation(委託)的部分特點:
1、A可以在任何有需要的時候調用B,把任務委託給B來做。
2、前者A擁有後者B,A中的所有功能都有B來做。
3、兩者通過指針聯繫,這種聯繫較弱。
4、A與B使用指針相連,二者的生存期不一致。
Delegation(委託)的語法:
Delegation(委託)的圖形表現形式
空心表示使用的是指針,String擁有StringRep
引申形式:
上圖中,三個對象共享一個Hello,n用作記錄對象個數。
如果a想改動Hello,系統會copy一個Hello出來供A來修改,但b,c不變,這一過程叫“copy on write”。
補充:
1.委託的方式非常實用,特有名稱爲Handle/Body(pImpI)
2.指針可以指向不同的實現類,這具有一定彈性,B無論怎樣變動都不會影響A,這一手法又稱“編譯防火牆”,A不用再編譯,只需編譯B。
Inheritance(繼承)is-a
典例:
Inheritance(繼承)的特點:
1、繼承有三種方式,即public/private/protected
2、Public繼承中,子類對象含有父類成分。
Inheritance(繼承)語法之一(public):
Inheritance(繼承)的圖形表現方式:
圖中,_List_node爲_List_node_base的子類
Inheritance(繼承)的存儲方式:
說明:子類的對象裏面有父類的成分。
Inheritance(繼承)關係下的構造和析構
補充:
1、繼承在和虛函數的結合上大放光彩;
2、base class 的dtor必須是virtual,否則會出現undefined behavior——也就是析構由外到內的好行爲。只要class現在或將來可能成爲父類,就要把class設爲virtual.