含有虛函式,虛繼承的類的大小

2021-08-22 02:52:05 字數 872 閱讀 1124

當類中含有虛繼承時(在vs環境下,linux環境下有歧義)

1. 派生類物件中會新增乙個指標,該指標指向虛繼承的基類,稱為虛類指標(cptr)。每乙個指標只指向其中乙個虛繼承的類,也就是說,虛繼承了幾個類,就會有幾個cptr。

2. 父類當中的成員變數、虛函式指標(vptr)、虛類指標(cptr)仍然會被複製到派生類當中。但在不同繼承模式下,vptr和cptr的效果是不同的。

vptr:普通繼承時,子類當中如果有虛函式,會直接在父類的虛函式表中新增或者替換相應的選項;虛繼承時,vptr指向的基類虛表不可以再增加了;如果在派生類新增虛函式,分為三種情況:

情況一:虛函式名稱與父類當中的某個虛函式名相同,且派生類含有建構函式,會在結構體中產生乙個和虛基類有關的vtordisp指標,該指標作用暫未知。

情況二:虛函式名稱與父類當中的某個虛函式名相同,且派生類不含建構函式,會直接修改基類虛函式表,類大小不變。

情況三:虛函式名稱與父類當中的任何乙個虛函式都不同,需要重新新增乙個vptr,重新產生乙個虛函式表,大小就會增加。

cptr:假設子類d同時繼承了父類b和父類c,兩個父類都虛繼承了類a(a是無任何虛繼承的類),根據子類d對b、c繼承方式的不同,其cptr的個數也是不同的

(1). 父類b、c都是普通繼承。這種情況下有兩個cptr,分別是從父類b和父類c中繼承過來的,且指向虛繼承的a。

(2). 父類c是虛繼承,b是普通繼承時(或相反情況)。普通繼承父類b時已經繼承過a(有了乙個cptr),因此在虛繼承父類c時,父類c虛繼承的類a就不會再次繼承,因此不會有第二個cptr指向a。虛繼承父類c也會產生乙個cptr。因此,此種情況下有兩個cptr。

(3). 父類b、c都是虛繼承。此時指向類a的cptr仍然只有乙個,另外有兩個cptr指向父類b、c,所以一共有三個cptr。

含有虛函式的類sizeof大小

01 include 02 using namespace std 04 class base1 06 virtual void fun11 07 public 08 virtual base1 09 11 class base2 13 15 class derivedfromone public ...

含有虛函式的類sizeof大小

說明 1 乙個類中若有虛函式,不論是自己的虛函式,還是繼承而來的 那麼類中就有乙個成員變數 虛函式指標,這個指標指向乙個虛函式表,虛函式表的第一項是類的typeinfo資訊,之後的項為此類的所有虛函式的位址。2 假設經過成員對齊後的類的大小為size個位元組。那麼類的sizeof大小可以這麼計算 s...

空類,虛函式類,虛繼承類的空間大小

include using namespace std class a a是空類,編譯器會用乙個char型別標記這個類,大小為1 class b public a b繼承了a,但同樣也是空類,大小為1 class c virtual public a 虛擬繼承的時候編譯器會安插乙個指向父類的指標,大...