54 多重繼承(下)單繼承多介面

2021-08-10 02:27:00 字數 1952 閱讀 8954

1、多重繼承問題三

derived繼承basea和baseb,如果ab中都含有1個虛函式,那麼derived就會疊加產生2個虛函式表指標指向這兩個虛函式表

#include 

#include

using

namespace

std;

class basea

};class baseb

};class derived : public basea, public baseb

;int main()

sizeof(d) = 8

using pa to call funca()...

basea::funca()

using pb to call funcb()...

baseb::funcb()

using pbc to call funcb()...

baseb::funcb()

pa = 0x7ffed5f93090

pb = 0x7ffed5f93098

pbe = 0x7ffed5f93090

pbc = 0x7ffed5f93098

2、解決方案

在d物件裡面存在兩個指向虛函式表的指標,這是由於繼承而來的。

先用pa指向d物件,再用pb指向d物件,pa和pb指向的位置不一樣

接下來通過pa進行強制型別轉換,將轉換的結果給pbb指標,此時pbb所指向的位置為pa的位置,不是pb的位置。

虛函式呼叫的過程:

首先先獲取pa的位址通過位址找到虛函式表指標vptr1,進而通過

虛函式表指標去找虛函式表中的函式位址,找到funca的函式位址

同理pb一樣;

pbb也是找到vptr1的虛函式表,但是裡面不存在funcb的函式,只有函式funca的函式,最終呼叫funca函式,

所以baseb* pbb = (baseb*)pa; 這個強制型別轉換有問題

所以要使用baseb* pbb =dynamic_cast

3、正確的使用多重繼承

bool equal(base* obj)//判斷引數的指標指向的是否為當前物件

5、小結

多繼承與多重繼承

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

C 多繼承 多重繼承

派生類都只有乙個基類,稱為單繼承。除此之外,c 也支援多繼承,即乙個派生類可以有兩個或多個基類。多繼承的語法也很簡單,將多個基類用逗號隔開。例如已宣告了類a 類b和類c,那麼可以這樣來宣告派生類d class d public a,private b,protected c d 是多繼承形式的派生類...

C 繼承5 多重繼承 多繼承

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