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

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

1樓:匿名使用者

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

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

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

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

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

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

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

2樓:匿名使用者

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

3樓:匿名使用者

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

c 語言,什麼是基類,什麼是派類

在 c 中,繼承機制通過類的派生實現,被繼承的類稱為基類或父類 在繼承類的基礎 上建立的新類稱為派生類或子類。派生類的定義格式為 class 派生類名 繼承方式基類名 1,繼承方式基類名 2,繼承方式基類名 n 其中,定義中的基類名必須是已有類的名稱,派生類名則是新建的類名。一個派生類可 以只有一個...

C基類中的保護成員在其派生類中可以訪問,而派生類物件不可訪問

在類外,你可以把保護成員和私有成員一樣看待。在類內部,你可以訪問基類保護成員,不可以訪問基類私有成員。公有成員則是暴露的,隨時處在風口浪尖之中。 在派生類類內的成員函式中,如果有派生類例項物件的引用或者指標。可以通過該引用或指標來訪問基類的protected成員 保護成員不能通過物件,在外部進行訪問...

C 類的公有繼承,基類的私有成員在派生類中不可見或不可訪問

3月21日晴 在c 語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼承稱為單繼承 從多個基類派生的繼承稱為多繼承。方式如下 公有繼承 public 私有繼承 private 保護繼承 protected 是常用的三種繼承方式。1.公有繼承 public 公有繼承的特點是...