C++中的菱形繼承深入分析
菱形繼承
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 :<span style="color:#FF0000;">virtual</span> public AA
{
public:
int _bb;
};
class CC :<span style="color:#FF0000;">virtual</span> 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)空間的問(wèn)題。
2.虛繼承體系看起來(lái)好復(fù)雜,在實(shí)際應(yīng)用我們通常不會(huì)定義如此復(fù)雜的繼承體系。一般不到萬(wàn)不得已都不要定義菱形結(jié)構(gòu)的虛繼承體系結(jié)構(gòu),因?yàn)槭褂锰摾^承解決數(shù)據(jù)冗余問(wèn)題也帶來(lái)了性能上的損耗。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
常用的C++標(biāo)準(zhǔn)庫(kù)頭文件小結(jié)
C++標(biāo)準(zhǔn)庫(kù)定義了一系列函數(shù)、宏和對(duì)象,以實(shí)現(xiàn)跨團(tuán)隊(duì)、跨平臺(tái)的高效且具有卓越性能的標(biāo)準(zhǔn)化 C++ 代碼, 本文介紹常用的C++標(biāo)準(zhǔn)庫(kù)頭文件,需要的朋友可以參考下2023-11-11
C++ auto自動(dòng)類型推導(dǎo)規(guī)則和使用詳解
C++11 賦予 auto 關(guān)鍵字新的含義,使用它來(lái)做自動(dòng)類型推導(dǎo)。也就是說(shuō),使用了 auto 關(guān)鍵字以后,編譯器會(huì)在編譯期間自動(dòng)推導(dǎo)出變量的類型,這樣我們就不用手動(dòng)指明變量的數(shù)據(jù)類型了2022-08-08
C語(yǔ)言for循環(huán)嵌套for循環(huán)在實(shí)踐題目中應(yīng)用詳解
初學(xué)C語(yǔ)言,常常遇到for循環(huán)中嵌套個(gè)for循環(huán),初學(xué)者對(duì)于這種形式總是一知半解,這次我就整理了常見(jiàn)的for循環(huán)嵌套for循環(huán)的題目,我們一起爭(zhēng)取一舉拿下這類題。學(xué)廢他們,以后再見(jiàn)到就不怕啦!每天都要學(xué)一點(diǎn)呀。加油,奮斗的我們2022-05-05
C/C++?for?語(yǔ)句的要點(diǎn)與注意事項(xiàng)小結(jié)
C/C++ 中的?for?語(yǔ)句是一種常用的循環(huán)結(jié)構(gòu),用于重復(fù)執(zhí)行一段代碼,直到滿足某個(gè)條件為止,這篇文章主要介紹了C/C++?for?語(yǔ)句的要點(diǎn)與注意事項(xiàng),需要的朋友可以參考下2024-06-06
C語(yǔ)言實(shí)現(xiàn)投票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)投票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
C語(yǔ)言實(shí)現(xiàn)將double/float 轉(zhuǎn)為字符串(帶自定義精度)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)將double/float 轉(zhuǎn)為字符串(帶自定義精度),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

