c++中,多型的實現需要虛函式,而虛函式主要包括兩部分,虛函式指標和虛函式表。
基類將自己的一些函式設為虛函式,子類則需要在繼承基類後,重寫或者直接使用從基類的繼承下來的虛函式。
基類自己會儲存乙份虛函式表,這個虛函式表含有指向基類虛函式的虛函式指標。當子類繼承基類後,同樣會將基類的虛函式表繼承下來,這樣子類便擁有了屬於自己的乙份虛函式表,如果子類重寫了基類的虛函式,那虛函式表的對應的虛函式指標將會修改,指向新的重寫虛函式。
c++的虛繼承,當子類虛繼承基類,子類會有乙份虛基類表,這個虛基類表儲存的是虛基類相對直接繼承類的偏移,雖然子類中依舊會有基類的乙份儲存,但是只有唯一乙份。當子類b虛繼承基類a,子類c虛繼承基類a,類d再多繼承b和c,由於b和c都有a的乙份儲存,編譯器只會存乙份給d,這樣就避免了菱形繼承問題。當類d呼叫建構函式時,會呼叫b和c的建構函式,但是b和c都繼承了a,為了避免都呼叫a建構函式造成兩份拷貝,編譯器讓b和c在呼叫建構函式的時候,先別呼叫a的建構函式,等到d調建構函式的時候,再來調a的建構函式。
虛繼承和虛函式繼承
虛繼承主要用於菱形 形式的繼承形式 虛繼承是為了在多繼承的時候避免引發歧義,比如類 有個就是a,繼承了 c也繼承了 當 多繼承 時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多...
虛函式 虛繼承 C
關於虛表,我們就要用到乙個關鍵字 virtual,可以修飾函式,也可以修飾類。類的成員函式被virtual修飾之後,就成為了虛函式 修飾類,主要是虛繼承。在此之前,我們首先要了解乙個概念 物件模型,也就是說,乙個基類形成之後,裡面的成員是怎麼存放的,當派生類繼承基類之後,派生類的成員是怎麼存放的。我...
C 虛繼承和虛繼承
虛繼承是在多繼承中為了解決衝突而技術。學術一點來說,是指乙個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基類直接或間接派生的其他類。虛繼承非常有用,可以避免多繼承的歧義和多重拷貝。考慮有如下繼承結構。b和c繼承a,d多繼承b c,我們看以下 class a class b publi...