虛擬繼承解決菱形繼承帶來的二義性問題的過程詳析

2021-07-30 04:29:49 字數 1000 閱讀 5294

二義性問題請詳細看:

#include

using namespace std;

class grandam

};class mother :virtual

public grandam

};class aunt :virtual

public grandam

};class daughter :public mother,public aunt

};int main()

結果如下圖所示:

我們可以檢視物件的記憶體,來知道記憶體裡存放的具體數字:

,在ptr=&d處打斷點,在程式執行到此處時,在記憶體視窗中列印&d,這樣就可檢視物件d的記憶體*,如圖所示:*

可以看出前兩行的第一行存放的是基類物件基於基類的偏移量,為0。而第二行存放的是該派生類物件d基於基類的偏移量8。下面就總結處虛擬繼承的具體實現過程。

物件怎麼知道呼叫的是哪個成員,具體過程如下:

1. 指標或引用知道你呼叫了哪個物件;

2. 物件可以得到存放基於基類的偏移量的位址;

3. 通過該位址獲得基於基類的偏移量;

4. 從而基類物件的this指標加上該偏移量,便可以區分呼叫的是哪個派生類物件的哪個成員。

注意:

菱形繼承 菱形虛擬繼承

菱形繼承 鑽石繼承 模型 拿如下 舉例 class person class student public person class teacher public person class graduate public student,public teacher void test 當派生類gr...

繼承 多繼承 菱形虛擬繼承

繼承 繼承是由父類和子類 或稱之為基類與派生類 兩種角色構成,子承父業,就是說派生類會繼承基類的所有的成員,並擁有自己特有的成員。用一段 來解釋說明繼承關係 include using namespace std class base 基類 class derived public base 以共有...

菱形虛擬繼承

菱形繼承在c 繼承中是一種複雜的繼承關係,存在著二義性和資料冗餘的問題,而菱形虛擬繼承則是為了解決菱形繼承所存在的問題。為了 菱形虛擬繼承如何解決該問題,我先建立個乙個較為簡單的菱形繼承模型。下面分別是菱形繼承和菱形虛擬繼承的 實現 菱形繼承 include includeusing namespa...