c 的多重繼承

2021-07-23 23:56:02 字數 2130 閱讀 1300

一、前言

每個類只繼承乙個父輩,在現實世界中事情通常是這樣的,但是有一些類卻代表兩個類的合成。例如兩用沙發,它是一張床,也是乙個沙發。

二、示例**,用作下面提出問題使用

#include

using namespace std;

class bed

void setweight(int i)

void sleep()

};class sofa

void setweight(int i)

void watchtv()

};class bed_and_sofa :public bed, public sofa

void foldout()

};int main()

三、繼承的模糊性我們從示例**中,可以發現他們共用的變數是weight,這樣我們就不知道bed_and_sofa到底是繼承哪乙個,或者是兩個都繼承,那麼你在使用的時候,使用哪個了?這樣會造成weight的引用變的模糊。例如如下**塊:

//為了修改weight的值,只有在主函式中輸入如下**,確定修改那個基類的weight

int main()

如上的方式是可以解決,多繼承帶來的模糊性問題,但是這也增加了程式設計師的壓力。

四、虛擬繼承

從意義上來分析,我們剛才提出的兩個例子,並沒有什麼現實生活的意義。但是我們都知道家具都是有重量的。所以我們把示例**重新編寫:

#include

using namespace std;

class furniture

void setweight(int i)

int getweight()

protected:

int weight;

};class bed:public furniture

void sleep()

};class sofa:public furniture

void watchtv()

};class bed_and_sofa :public bed, public sofa

void foldout()

};int main()

對於上述的問題,我們發現bed_and_sofa繼承了兩個furniture類,出現了模糊繼承的。所以為了解決這個問題,我們提出了虛擬繼承。修改上述**:

#include

using namespace std;

class furniture

void setweight(int i)

int getweight()

protected:

int weight;

};class bed:virtual

public furniture //虛擬繼承

void sleep()

};class sofa :virtual

public furniture //虛擬繼承

void watchtv()

};class bed_and_sofa :public bed, public sofa

void foldout()

};int main()

修改後的程式可以正常的執行,到底虛擬繼承做了宣告可以讓程式正常執行了,下面我們給出bed_and_sofa的記憶體布局,你就明白了

所以virtual只是告訴系統,如果之前沒有別人繼承furniture的話,那麼就在加入乙個furniture拷貝,否則就用之前拷貝的那個。

五、多繼承的構造順序

(1)任何虛擬基類建構函式按照繼承順序構造

(2)任何非虛擬基類建構函式按照繼承順序構造

(3)任何成員物件的建構函式按照他們 的宣告方式構造

(4)類自己的建構函式。

多重繼承 C 中的多重繼承

多重繼承是c 的一項功能,其中乙個類可以從多個類繼承。繼承類的建構函式以它們繼承的相同順序被呼叫。例如,在以下程式中,在a的建構函式之前呼叫b的建構函式。include using namespace std class a class b class c public b,public a not...

c 多重繼承

其實想寫這篇文章,是因為突然在整理論壇上的帖子的時候,突然發現乙個人問我如何才能在c 中實現多重繼承,當時我答的很隱晦,因此這裡我想補充說明一下.首先,我要說明一下,c 中是沒有類的多重繼承這個概念.要使用多重繼承必須要通過介面inte ce來完成.可是大家都知道inte ce實際上就是乙個虛函式列...

C 多重繼承

c 中的多繼承可看做是單繼承的擴充套件,就是乙個派生類對應多個基類。以下是一段多重繼承的 class a class b class c public a,public b 以上的程式中,派生類c繼承了基類a b。派生類c中,公有繼承了a,所以c的共有成員中有a中的兩個共有成員函式,而私有繼承的b基...