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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

菱形繼承 虛繼承

2019-11-06 06:10:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

        我們由上篇博客介紹了繼承的分類,并用文字解釋了他們,今天我們將從它們的底層內(nèi)存分布模板來(lái)進(jìn)一步了解與學(xué)習(xí)。

        單繼承:一個(gè)類只有一個(gè)直接父類

        單繼承實(shí)例:

class A{public:	int _a;};class B:public A{public:	int _b;};void funtest(){	B b;	b._a = 2;	b._b = 1;	}int main(){ 	funtest();	system("pause");	return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ),如圖

       多繼承:一個(gè)類有兩個(gè)或兩個(gè)以上直接父類

       多繼承實(shí)例:

class A{public:	int _a;};class C{public:	int _c;};class D{public:	int _d;};class B:public A,public C,public D{public:	int _b;};void funtest(){	B b;	b._a = 1;	b._c = 2;	b._d = 3;	b._b = 4;	}int main(){ 	funtest();	system("pause");	return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ),如圖

     菱形繼承:(鉆石繼承)

      程序?qū)嵗?/p>

class A{public:	int _a;};class C:public A{public:	int _c;};class D:public A{public:	int _d;};class B:public C,public D{public:	int _b;};void funtest(){	B b;	b.C::_a = 1;	b.D::_a = 2;	b._c = 3;	b._d = 4;	b._b = 5;}int main(){ 	funtest();	system("pause");	return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ),如圖

由于菱形繼承在訪問(wèn)數(shù)據(jù)成員時(shí)會(huì)產(chǎn)生二義性和數(shù)據(jù)冗余問(wèn)題,于是我們想出了虛繼承的方法。

繼承時(shí)采用關(guān)鍵字virtual來(lái)修飾基類。

虛繼承實(shí)例:

class A{public:	int _a;};class B:virtual public A{public:	int _b;};void funtest(){	B b;	b._a = 1;	b._b = 2;	}int main(){ 	funtest();	system("pause");	return 0;}

我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ),如圖

我們已經(jīng)初步開(kāi)始了解了虛繼承,接下來(lái)有三個(gè)問(wèn)題:

      問(wèn)題一:虛擬繼承的構(gòu)造函數(shù)做了什么事情?

                 構(gòu)造函數(shù)由系統(tǒng)自動(dòng)合成,將偏移量表格的地址放入派生類對(duì)象的前4個(gè)字節(jié)。

   問(wèn)題二:虛擬繼承與直接繼承有什么區(qū)別?

              1.將偏移量表格的地址放入派生類對(duì)象的前4個(gè)字節(jié)

              2.虛擬繼承的底層實(shí)現(xiàn)我們可以看到,首先push了一個(gè)1,作為虛擬繼承的標(biāo)志

   問(wèn)題三:菱形虛擬繼承(解決菱形繼承的二義性問(wèn)題)

菱形虛擬繼承實(shí)例:

class A{public:	int _a;};class C:virtual public A{public:	int _c;};class D:virtual public A{public:	int _d;};class B:public C,public D{public:	int _b;};void funtest(){	B b;	b._a = 1;	b._c = 3;	b._d = 4;	b._b = 5;}int main(){ 	funtest();	system("pause");	return 0;}我們給派生類中的數(shù)據(jù)成員賦上初值來(lái)方便我們了解派生類對(duì)象的各個(gè)數(shù)據(jù)成員在內(nèi)存中的存儲(chǔ)

菱形虛擬繼承的大小,用sizeof求字節(jié)數(shù)

得到D為24個(gè)字節(jié),由上圖的內(nèi)存分布可以很容易的得出結(jié)論


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄂州市| 和林格尔县| 广水市| 民和| 通榆县| 阆中市| 松原市| 南靖县| 黄龙县| 平陆县| 延安市| 建昌县| 牙克石市| 张北县| 玉树县| 常宁市| 凯里市| 岑溪市| 睢宁县| 都昌县| 永安市| 南华县| 谢通门县| 怀安县| 灵丘县| 彰化县| 山丹县| 湖北省| 张北县| 肃宁县| 治多县| 宣武区| 宜阳县| 南投县| 沙雅县| 兴山县| 永定县| 汪清县| 资中县| 临城县| 南陵县|