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

C++中菱形繼承和虛繼承的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)C++中菱形繼承和虛繼承的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出晉江免費(fèi)做網(wǎng)站回饋大家。

繼承:

      1. 單繼承–一個(gè)子類只有一個(gè)直接父類時(shí)稱這個(gè)繼承關(guān)系為單繼承

      2. 多繼承–一個(gè)子類有兩個(gè)或以上直接父類時(shí)稱這個(gè)繼承關(guān)系為多繼承

例如下面這兩個(gè)例子:

例一(單繼承):

class A
{
public:
 int _a;
};

class B : public A // B是 子類/派生類, 公有 繼承父類/基類 A
{
public:
 int _b;
};

class C : public B //C是 子類/派生類, 公有繼承 父類/基類 B
{
public:
 int _c;
};

例二(多繼承):

class A
{
public:
 int _a;
};

class B 
{
public:
 int _b;
};

class C : public A , public B // 子類C同時(shí)公有繼承父類A和父類B
{
public:
 int _c;
};

用圖很形象的表示一下:

C++中菱形繼承和虛繼承的示例分析

但是在使用過程中,很容易出現(xiàn)一種繼承關(guān)系叫菱形繼承。就好比下面這種繼承方式。

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;
};

C++中菱形繼承和虛繼承的示例分析

繼承的方式簡(jiǎn)單畫出來就是下面這樣:

C++中菱形繼承和虛繼承的示例分析

我們?cè)谑褂眠^程中會(huì)發(fā)現(xiàn)以下缺點(diǎn):

      1、 當(dāng)我們用D類創(chuàng)建出對(duì)象d時(shí),可以訪問到_a,但是一旦編譯就會(huì)出現(xiàn)錯(cuò)誤。錯(cuò)誤說明為: C2385: 對(duì)“_a”的訪問不明確。從圖中也可以看出,如果用d訪問_a時(shí),可能在B類里,也同時(shí)可能存在于c類中。這就是所謂的“二義性”;

      2、雖然B類和C類都公有繼承A,但是在D類公有繼承B,C時(shí),存放了兩份A類,造成了數(shù)據(jù)的冗余。

C++針對(duì)這種缺陷提出了另外一種繼承方式叫做虛繼承。

虛繼承

C++使用虛擬繼承(Virtual Inheritance),解決從不同途徑繼承來的同名的數(shù)據(jù)成員在內(nèi)存中有不同的拷貝造成數(shù)據(jù)不一致問題,將共同基類設(shè)置為虛基類。這時(shí)從不同的路徑繼承過來的同名數(shù)據(jù)成員在內(nèi)存中就只有一個(gè)拷貝,同一個(gè)函數(shù)名也只有一個(gè)映射。

◇語法:

class 派生類: virtual 基類1,virtual 基類2,…,virtual 基類n

{

…//派生類成員聲明

};

在有了虛繼承的概念后,我們就可以規(guī)避上面的缺點(diǎn)了。

class A
{
public:
 int _a;
};

class B : virtual public A
{
public:
 int _b;
};

class C : virtual public A
{
public:
 int _c;
};

class D : public B, public C
{
public:
 int _d;
};

當(dāng)我們使用了虛繼承時(shí),繼承模型就改變?yōu)橄旅孢@樣:

C++中菱形繼承和虛繼承的示例分析

由于我所使用的是vs2015,在此編譯器下對(duì)應(yīng)的處理方式就是這樣。將class B 和 class C設(shè)置為虛繼承后,編譯器將class A存放在了最下端,并在B和C類的前四個(gè)字節(jié)中存放了一個(gè)地址,當(dāng)我們?cè)L問過去向下再多看四個(gè)字節(jié)時(shí)就會(huì)發(fā)現(xiàn)這其中存放了一個(gè)數(shù)字。而這個(gè)數(shù)字就類似于“偏移量”,記錄了該類的首地址距父類首地址之間的字節(jié)差距。比如class B中,我們找到對(duì)應(yīng)數(shù)字為14,但是這個(gè)數(shù)字是16進(jìn)制,轉(zhuǎn)為10進(jìn)制為20,在class B的首地址加上20個(gè)字節(jié)就恰好是class A的首地址,同理class C。

因此在class D訪問_a時(shí),就不會(huì)產(chǎn)生二義性,_a數(shù)據(jù)也只存放了一份,解決了之前菱形繼承所帶來的問題。

但是還存在一個(gè)問題:當(dāng)我們求沒有使用虛繼承之前的class D的大小,結(jié)果是20,但是在使用了虛繼承后大小變?yōu)?4。所以雖然使用虛繼承解決數(shù)據(jù)冗余問題也帶來了性能上的損耗。(關(guān)于如何計(jì)算內(nèi)存大小,可以參考此鏈接。)

關(guān)于“C++中菱形繼承和虛繼承的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

分享標(biāo)題:C++中菱形繼承和虛繼承的示例分析
文章起源:http://chinadenli.net/article2/jsepoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、小程序開發(fā)網(wǎng)站收錄商城網(wǎng)站、搜索引擎優(yōu)化、虛擬主機(jī)

廣告

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

成都網(wǎng)頁設(shè)計(jì)公司
国产又粗又猛又爽色噜噜| 91人妻人人揉人人澡人| 五月婷婷六月丁香在线观看| 欧美日韩国产二三四区| 伊人网免费在线观看高清版| 国产一级特黄在线观看| 久久香蕉综合网精品视频| 91欧美亚洲精品在线观看| 色婷婷视频在线精品免费观看| 中文字幕高清不卡一区| 欧美一级不卡视频在线观看| 欧美日韩国产的另类视频| 欧美国产亚洲一区二区三区| 尤物久久91欧美人禽亚洲| 福利视频一区二区在线| 日韩在线免费看中文字幕| 日韩特级黄色大片在线观看| 国产精品欧美一区两区| 日本精品中文字幕人妻| 欧美日韩一区二区综合| 免费特黄欧美亚洲黄片| 空之色水之色在线播放| 好吊一区二区三区在线看| 日本精品最新字幕视频播放| 久热人妻中文字幕一区二区| 欧美日韩精品综合在线| 激情丁香激情五月婷婷| 免费观看在线午夜视频| 女人精品内射国产99| 暴力三级a特黄在线观看| 久久成人国产欧美精品一区二区| 亚洲av熟女国产一区二区三区站| 精品人妻av区波多野结依 | 亚洲欧美日韩国产自拍| 99在线视频精品免费播放| 国内外激情免费在线视频| 国产av一区二区三区麻豆| 国产一区欧美一区日韩一区| 日韩精品视频免费观看| 91老熟妇嗷嗷叫太91| 91欧美日韩一区人妻少妇|