有虛函式或虛繼承關係的sizeof問題

2021-06-17 15:42:41 字數 566 閱讀 6482

1.只存在虛函式時的情況

存在vtptr指標,指向虛函式表。在普通繼承時,子類會修改父類的虛函式表(在尾部新增子類的虛函式指標),所以子類物件的首部不會增加自己的vtptr。

具體內容見:

2. 存在虛繼承關係時的情況

有關虛繼承的定義,參見博文

在多層繼承關係中,虛基類為各子類共享,即記憶體中只有乙份虛基類物件,所以子類不能修改虛基類的虛函式表,為什麼不能修改下文再講。故虛繼承中,子類會有自己的vtptr,同時會增加乙個vbptr指向虛基類物件,所以會增加8b(多繼承時會增加8b的整數倍)。

3.為什麼不能修改虛基類的虛函式表?

如有下面繼承關係的情況發生。

若d1修改了基類b的虛函式表,則繼承類d2也會修改b的虛函式表,但是之前d1在虛函式表中的虛函式指標也會被d2所觀察到,但是d2並沒有繼承d1,故沒有許可權使用d1的函式,所以這是不允許的。因此虛繼承基類物件的內容繼承類不應該修改。本質原因還是虛基類為所有繼承類共享。

其他內容可參考

虛繼承,虛函式和虛指標之間的關係

自本人知乎回答 1.在乙個虛繼承的體系中,所有類都沒有虛函式,那麼這些類的物件模型中存不存在vptr?2.在乙個類的物件模型中,存在vptr的充要條件是什麼?3.a類的物件模型中有vptr a,b類普通繼承a類。b類需要滿足什麼條件,其物件模型中,除了含有vptr a以外,還含有vptr b?4.a...

虛函式 虛繼承

include using namespace std class a class b public a class c public b int main 結果是 4,4,4 為什麼?一,在private,protect,public的實際繼承中,派生類和基類擁有相同的虛函式表。但如果是虛繼承,會...

虛函式,虛繼承

1 空類,空類單繼承,空類多繼承的sizeof include using namespace std class base1 class base2 class derived1 public base1 class derived2 public base1,public base2 int m...