C 編譯除錯看多型實現原理

2021-08-18 12:56:18 字數 2124 閱讀 5838

c++多型實現原理**

//有虛函式的類a

class a;};

//有虛函式的類c

class c;};

//繼承a和c的類b 多繼承

class b: public a, public c

;//沒有虛函式的類d

class d

;//有函式,但不是虛函式

class e;};

//繼承有虛函式的類f

class f: public c

;//有成員變數的g

class g

;

int _tmain(int argc, _tchar* argv)

;        //自己的虛函式

難道說派生類中的虛函式相當於普通函式嗎?派生類中定義的非基類的虛函式,並沒有產生新的虛函式表,也沒有在基類的虛函式表中存在。

003d7b00 屬於虛函式指標起始位址

003d12b7 h::fun位址

003d12c6 a::fun位址

003d12b2 h::testfun位址 說明派生類的虛函式也是儲存在那乙個虛函式表,只是編譯器上沒有顯示出來而已(個人觀點,如果不對,請指正)

00000000  null 本以為這個位置是普通函式的位址,但是普通函式是不會儲存在虛函式表中的

派生類的虛函式和普通函式還是有區別的。編譯器並不是按照同樣的方式處理的。

除錯看多型:

從記憶體上看,如果單純的基類,虛函式表中的位址是基類函式位址;00f07958  vfptr指標指向到了base1基類的位址

但當基類指標賦值之類物件位址後位址 00f00785c vfptr 指向派生類derived1類的vfptr指標,虛函式表被替換為derived1的虛函式表。在編譯的時候位址是不確定的,只有在執行時,給父類指標賦值後,指向才會改變,才知道執行時呼叫那乙個函式;

當你將其賦值為另外的子類物件時,相應的位址也會隨之改變,可以看到賦值改變後,vfptr改變未00f078b8,為第二個派生類的虛函式指標位址;

輸出結果:

我認為多型的原理,就是如果乙個類中含有虛函式,那麼這個類在例項化的時候就會產生乙個虛函式表vftable,虛函式表中有乙個虛函式指標vfptr,虛函式在虛函式表中的位置是按照宣告時候的順序確定的;在建立乙個指向基類物件指標,這個時候這個指標是什麼也沒有的,指向null, 當你給他賦值某乙個子類物件的時候,這個基類指標的vftable就會被替換為賦值後的那個子類的vftable虛函式表,這時候,vfptr指標也指向那個子類的虛函式位址(我認為這個過程叫動態繫結);只時候通過基類指標就能找到派生類函式的位址,執行的時候就不會呼叫到基類的函式,因為虛函式表已經被替換掉了,通過vfptr指標只能找到派生類的函式位址。

C 多型實現原理

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

C 多型原理詳解(GDB除錯分析)

在計算類大小時提及到了類中虛指標及虛函式表的結構,但並沒有相對較為充足的依據,下來借助gdb工具來分析一下c 中虛指標及虛函式表的詳細結構 以下 執行環境均為linux下的64位作業系統 無繼承的單類案例 如下 include using namespace std class a virtual ...

C 多型的實現原理

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