菱形繼承
class Person{ int _AA;};class Student:public Person{ int _BB;};class Teacher :public Person{ int _CC;};class Assistant :public Student, public Teacher{ int _DD;};PS:
Assistant的對(duì)象中存在兩份Person成員
菱形繼承存在二義性和數(shù)據(jù)冗余
解決:
使用虛繼承
首先不使用虛繼承時(shí):
#include<iostream>using namespace std;class AA{public: string _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(){ DD d; d.BB::_aa = 1; d.CC::_aa = 2; d._bb = 3; d._cc = 4; d._dd = 5; cout << sizeof(d) << endl; return 0;}
菱形繼承對(duì)象模型:
使用虛繼承時(shí):
#include<iostream>using namespace std;class AA{public: string _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(){ DD d; d.BB::_aa = 1; d.CC::_aa = 2; d._bb = 3; d._cc = 4; d._dd = 5; cout << sizeof(d) << endl; return 0;}
菱形虛擬繼承對(duì)象模型:
兩個(gè)空格處地址相差為8,第一個(gè)空格處存放空格處位置到AA的偏移量為20,第二個(gè)空格處存放空格處位置到AA的偏移量為12,浪費(fèi)兩個(gè)空間存放偏移量,AA只需計(jì)算一次。
PS:
1.虛繼承解決了在菱形繼承體系里面子類對(duì)象包含多份父類對(duì)象的數(shù)據(jù)冗余&浪費(fèi)空間的問題。2.虛繼承體系看起來好復(fù)雜,在實(shí)際應(yīng)用我們通常不會(huì)定義如此復(fù)雜的繼承體系。一般不到萬不得已都不要定義菱形結(jié)構(gòu)的虛繼承體系結(jié)構(gòu),因?yàn)槭褂锰摾^承解決數(shù)據(jù)冗余問題也帶來了性能上的損耗。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注