C++中菱形繼承和虛繼承的示例分析-創(chuàng)新互聯(lián)

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

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名與空間、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、瑪多網(wǎng)站維護、網(wǎng)站推廣。

繼承:

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

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

例如下面這兩個例子:

例一(單繼承):

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同時公有繼承父類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++中菱形繼承和虛繼承的示例分析

繼承的方式簡單畫出來就是下面這樣:

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

我們在使用過程中會發(fā)現(xiàn)以下缺點:

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

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

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

虛繼承

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

◇語法:

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

{

…//派生類成員聲明

};

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

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

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

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

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

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

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

文章題目:C++中菱形繼承和虛繼承的示例分析-創(chuàng)新互聯(lián)
標題URL:http://www.muchs.cn/article2/ddspic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、微信小程序、Google、關(guān)鍵詞優(yōu)化、自適應(yīng)網(wǎng)站、網(wǎng)站排名

廣告

聲明:本網(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)

成都定制網(wǎng)站建設(shè)