国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++中的菱形繼承深入分析

2020-01-26 14:02:24
字體:
供稿:網(wǎng)友

菱形繼承

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)空間的問題。

2.虛繼承體系看起來好復(fù)雜,在實(shí)際應(yīng)用我們通常不會(huì)定義如此復(fù)雜的繼承體系。一般不到萬不得已都不要定義菱形結(jié)構(gòu)的虛繼承體系結(jié)構(gòu),因?yàn)槭褂锰摾^承解決數(shù)據(jù)冗余問題也帶來了性能上的損耗。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙口市| 闻喜县| 连平县| 清涧县| 平乡县| 镇安县| 朝阳市| 尖扎县| 石家庄市| 裕民县| 静安区| 山西省| 宝鸡市| 洪洞县| 巨野县| 河池市| 青河县| 岚皋县| 广德县| 华蓥市| 元江| 德保县| 迁安市| 石嘴山市| 汕尾市| 宜宾市| 华容县| 同江市| 廊坊市| 东辽县| 喜德县| 嘉禾县| 宝丰县| 双辽市| 仪征市| 阿瓦提县| 汶川县| 安顺市| 利辛县| 深泽县| 县级市|