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

首頁 > 學院 > 開發設計 > 正文

菱形繼承和菱形虛繼承的對象模型

2019-11-08 03:10:39
字體:
來源:轉載
供稿:網友

菱形繼承就是如下圖所示的繼承關系,其中A是B和C的父類,B和C是D的父類,由于C++允許多重繼承,所以便出現這種菱形繼承關系,是問題變得復雜,成員關系以及對象模型更為復雜。 這里寫圖片描述 在VS2015小端32位機器下面我們通過一個簡單的菱形繼承例子來研究一下這種繼承關系的對象模型和虛繼承的對象模型。

class A{public: int _a;};class B : public A{public: int _b;};class C : public A{public: int _c;};class D :public B, public C{public: int _d;};int main(){ D d1; d1.B::_a = 0; d1.C::_a = 1; d1._b = 2; d1._c = 3; d1._d = 4; return 0;}

我們知道菱形繼承有兩個缺點,一個是二義性,所以在main函數中d1.B::_a=0;d1.C::_a=0;這兩行代碼的_a變量前都加了域作用限定符,以此來區分是繼承自哪一個類的變量。另一個缺點是數據冗余,這里我們通過內存來研究,在mian函數中編寫如下代碼:

int main(){ D d1; d1.B::_a = 0; d1.C::_a = 1; d1._b = 2; d1._c = 3; d1._d = 4;}

通過逐行運行代碼觀察內存中的數據變化:

這里寫圖片描述

整理一下可以得到如下所示的抽象圖形(上方為高地址,下方為低地址): 這里寫圖片描述

在這里我們可以看到這個簡單的菱形繼承關系的對象模型是如上圖所示的一個樣子,從圖中可以很直觀的看出菱形繼承的數據冗余這一缺點,在子類D中,由于是繼承B類和C類所來的,所以將B類和C類從A類繼承來的A類的成員—_a保存了兩份,很明顯這在很大程度上就造成了數據的多余,我們知道用virtual可以解決這一問題,那么使用virtual進行虛繼承它的底層到底是怎么實現的呢?讓我們通過內存來探究。

同樣的整理之后如下圖所示: 這里寫圖片描述

觀察這個圖我們可以看到,虛繼承以后,編譯系統將D類對象中從最初的父類A中繼承來的成員放在了最下方,在繼承B類和C類時在B類和C類的成員之前添加了一個指針,通過追蹤這個指針我們發現這個指針所指向的值是當前位置到D類對象d1的成員_a的偏移量(20和12),所以,通過這樣的一個方式,就不用將_a兩次寫入內存,節省了空間,但是若要使用,則需要編譯系統通過指針去使用,這使得程序的效率變低。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南溪县| 类乌齐县| 旬邑县| 珲春市| 调兵山市| 东阿县| 彰化市| 兴城市| 手游| 巴彦淖尔市| 大化| 鱼台县| 离岛区| 达拉特旗| 固镇县| 蕉岭县| 什邡市| 华池县| 本溪| 镇巴县| 双牌县| 卢湾区| 天津市| 宝清县| 遂平县| 高清| 沅陵县| 渝中区| 纳雍县| 长葛市| 库车县| 梨树县| 无为县| 安溪县| 松原市| 眉山市| 杂多县| 驻马店市| 碌曲县| 河东区| 杭锦后旗|