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的對象中存在兩份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;
}

菱形繼承對象模型:

使用虛繼承時(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;
}

菱形虛擬繼承對象模型:

兩個空格處地址相差為8,第一個空格處存放空格處位置到AA的偏移量為20,第二個空格處存放空格處位置到AA的偏移量為12,浪費(fèi)兩個空間存放偏移量,AA只需計(jì)算一次。
PS:
1.虛繼承解決了在菱形繼承體系里面子類對象包含多份父類對象的數(shù)據(jù)冗余&浪費(fèi)空間的問題。
2.虛繼承體系看起來好復(fù)雜,在實(shí)際應(yīng)用我們通常不會定義如此復(fù)雜的繼承體系。一般不到萬不得已都不要定義菱形結(jié)構(gòu)的虛繼承體系結(jié)構(gòu),因?yàn)槭褂锰摾^承解決數(shù)據(jù)冗余問題也帶來了性能上的損耗。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Java?C++?算法題解leetcode669修剪二叉搜索樹示例
這篇文章主要為大家介紹了Java?C++?算法題解leetcode669修剪二叉搜索樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
C語言實(shí)現(xiàn)大數(shù)據(jù)文件的內(nèi)存映射機(jī)制
這篇文章主要介紹了C語言實(shí)現(xiàn)大數(shù)據(jù)文件的內(nèi)存映射機(jī)制的相關(guān)資料,需要的朋友可以參考下2017-01-01

