當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表。虛函式表用來儲存虛函式指標的資料結構,由編譯器自動生成和維護。
當存在虛函式時,每個物件都有乙個指向虛函式表的指標(vptr)。編譯器不需要區分子類物件或者父類物件,只需要根據vptr指標來確定呼叫的函式。
編譯器確定是否為虛函式:
fun不是虛函式,編譯器可直接確定被呼叫的成員函式(靜態聯編,根據parent的型別確定)
fun是虛函式,編譯器根據物件p的vptr指標所指的虛函式表查詢fun函式
類定義宣告
//-- 證明vptr指標存在
#if 1
class
aprivate
:int a;};
class
bprivate
:int b;};
#endif
main函式
//-- 證明vptr指標存在
#if 1
intmain()
#endif
輸出結果:
a分配的記憶體:
4a分配的記憶體:
8
物件中的vptr指標什麼時候被初始化?
物件在建立時,由編譯器對vptr指標進行初始化。只用當物件的建構函式完全結束後vptr的指向才最終確定。
C 基礎 多型的實現原理分析
多型的實現原理分析 virtual fun ptr 虛函式表指標 乙個類裡面不管有幾個虛函式,只有乙個虛函式表,只需將其加入表中即可,而指向這個表的指標只有乙個,即虛函式表指標 根據賦值相容規則,父類通過指標和引用子類物件後,只能訪問父類的方法,那為什麼將父類的函式寫為虛函式,子類重寫後,父類卻可以...
C 多型的實現原理
1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。3.多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。4.多型用虛函式來實...
C 多型的實現原理
1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。3.多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。4.多型用虛函式來實...