菱形繼承(多繼承): 兩個子類繼承同一個父類,而又有子類 同時繼承這兩個子類。
菱形繼承關系模型如下圖:
菱形繼承的代碼如下:DD的對象中有兩個AA成員
#include<iostream>#include<stdlib.h>using namespace std;class AA{ public: int _aa;};class BB:public AA{ public: int _bb;};class CC:public AA{ public: int _cc;};class DD:public BB, public CC{ public: int _dd;};int main(){ AA a; BB b; CC c; DD d;// d.aa = 0; cout<<sizeof(a)<<endl; cout<<sizeof(b)<<endl; cout<<sizeof(c)<<endl; cout<<sizeof(d)<<endl; system("pause"); return 0;}菱形繼承運行結果:
![]()
菱形繼承的問題:存在二異性,數據冗余(浪費空間)的問題 二異性:
void Test(){ //顯示指定訪問哪個父類的成員 DD a; a.BB::_aa = "xxx"; a.CC::_aa = "yyy";}菱形虛擬繼承可解決二異性,數據冗余浪費空間的問題(需在子類BB和CC繼承父類AA時加Virtual)
菱形虛擬繼承的代碼如下:#include<iostream>#include<stdlib.h>using namespace std;class AA{ public: int _aa;};class BB:virtual public AA{ public: int _bb;};class CC:virtual public AA{ public: int _cc;};class DD:public BB, public CC{ public: int _dd;};int main(){ AA a; BB b; CC c; DD d; d._aa = 0; d._bb = 1; d._cc = 2; d._dd = 3; cout<<sizeof(a)<<endl; cout<<sizeof(b)<<endl; cout<<sizeof(c)<<endl; cout<<sizeof(d)<<endl; system("pause"); return 0;}菱形虛擬繼承的運行結果如下:
虛擬繼承雖然解決了二異性和數據冗余的問題,但由兩個運行結果可發現子類的大小并沒有減小反而曾大了,比預算的多出了8個字節,則進一步探索其內存,可直觀的看出其原因。菱形對象模型:
菱形虛擬對象模型:![]()
多態:當使用基類的指針或引用調用重寫的虛函數時,當指向父類調用的就是父類虛函數,指向子類調用的就是子類虛函數
新聞熱點
疑難解答
圖片精選