C 多型的實現原理

2021-09-13 03:25:27 字數 942 閱讀 6248

//  測試檔案

// 測試檔案

//// created by 吳珝君 on 2018/7/17.

//#include using namespace std;

class father

protected:

private:

};class son :public father

}; int main()

所謂的動態多型的實現原理

編譯器在編譯的時候,發現father類中有虛函式,此時編譯器會為每個包含虛函式的類建立乙個虛表,該表是乙個一維陣列,在這個陣列中儲存的是每個虛函式的位址。

那麼如何定位虛表呢,編譯器另外還為每個物件提供了乙個vpter指標,這個指標指向了物件所屬類的虛表,在程式執行的時候,根據物件的型別去初始化vptr。從而在

呼叫虛函式的時候,能夠找到正確的函式。對於上面的**,由於 f實際指向的物件型別是son 因此 f物件的vptr指標指向的是son類的vtable 當呼叫f->say()時,根據虛

函式的位址就可以找到say()函式。

正是由於每個物件呼叫的虛函式都是通過虛表指標來索引的也就決定了虛表指標的正確初始化是非常重要的,換句話說,在虛表指標沒有正確的初始化之前,我們不能夠呼叫虛函式

這就要保證虛函式的初始化的時機。

事實上,是在建構函式中進行虛表的建立和虛表指標的初始化,在構造子類物件的時候,要先呼叫父類的建構函式,由於這個時候,編譯器只看到了父類,那麼vptr指標指向的事父類的虛表

在子類建構函式被呼叫的時候,vptr指標指向的是子類的虛表

有了上面的說明,我們可以做出這樣的總結:

1、存在虛函式的類都有虛表。

2、虛表可以被繼承

3、派生類的虛表中虛位址的排列順序和基類事務虛表中虛函式位址排列順序相同。

4、c++的多型性是通過遲繫結實現的。

C 多型的實現原理

1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。3.多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。4.多型用虛函式來實...

C 多型的實現原理

1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。3.多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。4.多型用虛函式來實...

C 多型的實現原理

純虛函式 virtual void breathe 0 即抽象類!必須在子類實現這個函式 即先有名稱,沒內容,在派生類實現內容 我們先看乙個例子 include class animal 注意,在例1 1的程式中沒有定義虛函式。考慮一下例1 1的程式執行的結果是什麼?答案是輸出 animal bre...