C 多繼承 多重繼承

2021-10-09 13:36:10 字數 3482 閱讀 8051

派生類都只有乙個基類,稱為單繼承。除此之外,c++也支援多繼承,即乙個派生類可以有兩個或多個基類。

多繼承的語法也很簡單,將多個基類用逗號隔開。

例如已宣告了類a、類b和類c,那麼可以這樣來宣告派生類d:

class d: public a, private b, protected c

d 是多繼承形式的派生類,它以公有的方式繼承 a 類,以私有的方式繼承 b 類,以保護的方式繼承 c 類。d 根據不同的繼承方式獲取 a、b、c 中的成員,確定它們在派生類中的訪問許可權。

與單繼承形式基本相同,只是在派生類的建構函式中呼叫多個基類的建構函式。

以上面的 a、b、c、d 類為例,d 類建構函式的寫法為:

d

(形參列表):a

(實參列表),b

(實參列表),c

(實參列表)

多繼承的例項

#include

using namespace std;

//基類

class basea

;basea:

:basea

(int a,

int b)

:m_a

(a),

m_b(b)

basea::~

basea()

//基類

class baseb

;baseb:

:baseb

(int c,

int d)

:m_c

(c),

m_d(d)

baseb::~

baseb()

//派生類

class derived: public basea, public baseb

;derived:

:derived

(int a,

int b,

int c,

int d,

int e)

:basea

(a, b)

,baseb

(c, d)

,m_e

(e)derived::~

derived()

void derived:

:show()

intmain()

執行結果

basea constructor

.baseb constructor

derived constructor

1,2,3,4,5

derived destructor

baseb destructor

basea destructor

從執行結果來看,多繼承形式下析構函式的執行順序和建構函式的執行順序相反。

當兩個或多個基類有同名成員時,如果直接訪問該成員,就會產生命名衝突,編譯器不知道使用哪個基類的成員。這個時候需要在名字前面加上類名和域解析符::,以顯示地指明到底使用哪個類的成員,消除二義性。

#include

using namespace std;

//基類

class basea

;basea:

:basea

(int a,

int b)

:m_a

(a),

m_b(b)

basea::~

basea()

void basea:

:show()

//基類

class baseb

;baseb:

:baseb

(int c,

int d)

:m_c

(c),

m_d(d)

baseb::~

baseb()

void baseb:

:show()

//派生類

class derived: public basea, public baseb

;derived:

:derived

(int a,

int b,

int c,

int d,

int e)

:basea

(a, b)

,baseb

(c, d)

,m_e

(e)derived::~

derived()

void derived:

:display()

intmain()

執行結果

basea constructor

baseb constructor

derived constructor

m_a =

1m_b =

2m_c =

3m_d =

4m _e =

5derived destructor

baseb destructor

basea destructor

#include

using namespace std;

//基類a

class a;a:

:a(int a,

int b)

:m_a

(a),

m_b(b)

//基類b

class b;b:

:b(int b,

int c)

:m_b

(b),

m_c(c)

//派生類c

class c: public a, public b;c:

:c(int a,

int b,

int c,

int d):a

(a, b),b

(b, c)

,m_a

(a),

m_c(c)

,m_d

(d)void c:

:display()

intmain()

執行結果

a:

:m_a=

10,a:

:m_b=

20b:

:m_b=

20,b:

:m_c=

30c:

:m_a=

10,c:

:m_c=

30,c:

:m_d=

40

a、b 是基類,c 是派生類,假設 obj_c 的起始位址是 0x1000,那麼 obj_c 的記憶體分布如下圖所示:

基類物件的排列順序和繼承時宣告的順序相同。

C 繼承5 多重繼承 多繼承

多重繼承 1.person類,資料成員 m strname 成員函式 構造 析構 pay 2.soldier類,資料成員 m iage 成員函式 構造 析構 work 3.infantry類,資料成員 無 成員函式 構造 析構 attack 4.定義函式test1 person p test2 pe...

多繼承與多重繼承

什莫是多繼承?乙個類擁有兩個或者兩個以上的父類 什莫是多重繼承?乙個類不僅僅有父類還有祖父類 什莫是虛繼承?虛繼承是為了解決多繼承的問題 經過這樣的宣告後,當基類通過多條派生路徑被乙個派生類繼承時,該派生類只繼承該基類一次,也就是說,基類成員只保留一次。菱形繼承 以往,在派生類的建構函式中只需負責對...

python多重繼承 多繼承相關

1 使用父類名.方法名呼叫父類方法 class parent def init self,name self.name name print parent的init方法被呼叫 class son1 parent def init self,name,age self.age age parent.i...