C 中,虛基類是如何避免兩義性的

時間 2021-08-30 10:08:09

1樓:匿名使用者

c++的繼承中的基類就是派生類的一個子物件,也就是說基類是派生類的一個子部分,它佔用派生類的一部分記憶體。

當b類從a類派生時,b類物件中就會有sizeof (a)大小的儲存空間用於儲存a類子物件。當通過b類物件來訪問a類的成員時,產生的訪問指令使用的地址是b物件的起始地址 + a物件在b物件的偏移量 + a成員對a物件起始地址的偏移量。,通過這種方式就可以通過派生類來訪問基類成員,這個過程其實很像將基類物件作為派生類的成員物件。

如果b物件中有多個a類子物件那麼偏移量使用那一個呢? 編譯器在這裡不能做任何決定,所以就出現二義性錯誤。上面所說的計算完全由編譯器完成。

當通過派生類來訪問基類成員時,相應的訪問指令中的地址都將被轉換為派生類中基類物件的地址。對於單繼承派生類中的基類物件只有一個所以地址轉換沒有問題。對於有共同基類的繼承,派生類的記憶體中就會有那個共同基類的多個副本,所以地址轉換就會出現問題。

通過虛基類,那個共同基類在最終派生類中只有一個副本,地址轉換就像單繼承一樣。這裡的實現估計是需要額外的指標以指定虛基類子物件的位置。所以虛基類是有效能開銷的。

基類的成員函式在派生類中不佔儲存,成員函式只有一個副本。

實際上對於普通繼承來說,組合和繼承是差不多的。所以有人就建議優先使用組合。

2樓:匿名使用者

無論繼承多少次,在具體實現上,將派生類物件中內嵌的虛基類成員只有唯一的一份

3樓:匿名使用者

虛基類不例項化,一般使用方式是用虛基類的指標,指向派生類的物件地址,避免了倆義性,實現了多型

C 虛基類問題

首先.這個不叫虛基類 這只是一個普通繼承 基類裡面有一個虛擬函式 定義a p new c p是一個a型別的指標,但實際上p指向的是一個c型別 c型別也是a型別的一種,c繼承自a p show 的時候,因為a中的是 virtual show 即虛擬函式 所以會執行c的show 函式 這就是虛擬函式的一...

C 虛基類小問題

流星夢陽 你不要把虛函式與虛繼承弄混了,虛函式才是為了統一介面的,虛繼承是解決重複繼承的。所以一般的子類指標能自動轉換為父類指標,或引用,就像你這add函式中p一樣,new出的新物件都被自動轉換成staff型指標了。父類到子類一般是不行的,當然通過dynamic cast可以強制轉換但也不是都成功。...

C派生類指標指向基類物件,C 中基類指標指向派生類物件可以呼叫派生類的新增成員麼

需要知道一些常識,乙個類所有的函式都是再code 區中唯一的存放乙份。而資料成員則是每個物件儲存乙份,並按照宣告順序依次存放。類a中有了虛函式就會再類的資料成員的最前面新增乙個vfptr指標 void vfptr 這個指標用來指向乙個vtable表 乙個函式指標陣列 乙個類只有乙個該錶 該錶儲存著當...