欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

菱形的虛擬繼承-創(chuàng)新互聯(lián)

問題引入:

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了富平免費建站歡迎大家使用!

 如果有Base類,B1類,B2類,D類,如下圖繼承關(guān)系

 菱形的虛擬繼承

那么按一般的繼承來看,D類創(chuàng)造的對象會繼承B1類的方法與成員,同時也會繼承B2類的方法與成員;

接下來類B1 , B2 會分別去繼承Base類的方法與成員,那么D類的對象在調(diào)用Base類的方法時,到底是繼承B1類這邊的Base,還是會繼承B2類這邊的Base,此時就會產(chǎn)生二義性

為了解決這個問題,就看看虛擬繼承是怎么來解決這個二義性問題的

  1. 菱形的虛擬繼承的源代碼

#include <iostream>

using namespace std;

class Base

{

public:

Base()

{

cout << "Base()  " << this << endl;

}

~Base()

{

cout << "~Base()  " << this << endl;

}

int m_data1;

};

class B1 : virtual public Base

{

public:

B1()

{

cout << "B1()  " << this << endl;

}

~B1()

{

cout << "~B1()  " << this << endl;

}

int m_data2;

};

class B2 : virtual public Base

{

public:

B2()

{

cout << "B2()  " << this << endl;

}

~B2()

{

cout << "~B2()  " << this << endl;

}

int m_data3;

};

class D : public B1, public B2

{

public:

D()

{

B1::m_data2 = 0x1;

B1::m_data1 = 0x2;

B2::m_data3 = 0x3;

B2::m_data1 = 0x4;

m_data4 = 0x5;

cout << "D()" << this << endl;

}

~D()

{

cout << "~D()  " << this << endl;

}

int m_data4;

};

void Test()

{

D d;

//cout << sizeof(D) << endl;   //24

}

int main()

{

Test();

getchar();

return 0;

}

2.斷點打到D類的構(gòu)造函數(shù)這條語句B1::m_data2 = 0x1;運行完D類構(gòu)造函數(shù)后調(diào)試。

內(nèi)存1中的地址欄輸入&d可以看到類D對象的模型(取&d因為在Test()函數(shù)創(chuàng)建的是D類的d對象)

菱形的虛擬繼承

3.接下來問題就來了,明明是取D類對象d的地址,為什么這個地址下有存儲了地址,里面到底是什么東  西,那就看看吧,(可以看看反匯編和相應(yīng)的內(nèi)存)

菱形的虛擬繼承

此處可以看到它的地址偏移4個字節(jié)中存儲了0X 00 00 00 14

(這個數(shù)據(jù)有什么意義哪?)

在看看反匯編就可以了解到編譯器到底在搞什么鬼

菱形的虛擬繼承

看看在給m_data1賦值時,也就是給類Base數(shù)據(jù)賦值時,是什么情況

—————————————————————————————————

第一步 取得this指針給寄存器eax

第二步 將寄存器eax中內(nèi)容(即地址 (0x 00 B7 DC C8))給 ecx

第三步 將寄存器exc中內(nèi)容加4 (即 地址(0x 00 B7 DC CC))后,取其地址內(nèi)容給edx(內(nèi)容為 0X 00 00 00 14)

第四步 取this指針給寄存器eax

第五步 eax + edx 的結(jié)果為 (0x 00 30 FD 60 +  0X 00 00 00 14 = 0x 00 30 FD 74),接下來將數(shù)據(jù)2

   存放到這個地址下

——————————————————————————————————————

從模型圖可以看到地址(0x 00 30 FD 74)就是Base類的地址

為什么存放的是數(shù)據(jù)2,但是結(jié)果是4,這就要看清楚了,下面還有條語句未執(zhí)行,

那就是  B2::m_data1 = 0x4;

這就是菱形虛擬繼承下為了不產(chǎn)生二義性的奧妙

(D類繼承Base類的方法與成員,編譯器在內(nèi)存中只開辟了一塊)

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

本文題目:菱形的虛擬繼承-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://chinadenli.net/article48/depehp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、移動網(wǎng)站建設(shè)域名注冊、網(wǎng)站改版自適應(yīng)網(wǎng)站、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
久久热九九这里只有精品| 欧美日韩精品综合在线| 国产成人午夜av一区二区| 亚洲国产成人精品一区刚刚| 黄色激情视频中文字幕| 久久精品国产一区久久久| 日韩欧美国产精品自拍| 欧美做爰猛烈叫床大尺度| 伊人久久青草地婷婷综合| 太香蕉久久国产精品视频| 日本高清一区免费不卡| 国产熟女一区二区三区四区| 午夜福利黄片免费观看| 国产麻豆一线二线三线| 免费观看一区二区三区黄片| 亚洲中文字幕高清乱码毛片 | 国产免费自拍黄片免费看| 欧美一区二区口爆吞精| 亚洲综合日韩精品欧美综合区| 午夜福利在线观看免费| 九九热在线视频精品免费| 亚洲一二三四区免费视频| 欧美午夜视频免费观看| 色婷婷丁香激情五月天| 亚洲精品国产福利在线| 日本欧美在线一区二区三区| 日本精品最新字幕视频播放| 九九热在线视频观看最新| 国产又大又硬又粗又黄| 加勒比系列一区二区在线观看| 人妻内射在线二区一区| 少妇特黄av一区二区三区| 国产精品免费无遮挡不卡视频| 婷婷亚洲综合五月天麻豆| 亚洲一级二级三级精品| 国产精品一区二区视频| 人妻内射在线二区一区| 精品久久综合日本欧美| 久久经典一区二区三区| 久久99青青精品免费观看| 国产传媒中文字幕东京热|