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...