C 虛函式實現原理

2021-10-05 12:13:45 字數 1062 閱讀 2426

c++中的虛函式的作用主要是實現了多型的機制。基類定義虛函式,子類可以重寫該函式。

每個類物件新增乙個成員,該成員中儲存了乙個指向函式位址陣列的指標,稱為虛表指標(vptr),該陣列稱為虛函式表(virtual function table, vtbl),即,每個類使用乙個虛函式表,每個類物件用乙個虛表指標。

#include

using

namespace std;

class

base

virtual

voidb(

)virtual

voidc(

)private

:int x;};

class

child

:public base};

intmain()

說明:定義了基類base,包含三個虛函式a、b、c和乙個int成員變數x,子類child重新實現了函式b。

在vs2015 x86下編譯執行輸出如下:sizeof(c)結果為8,是因為在32位處理器上,虛標指標占用4位元組,成員變數x占用4位元組。

檢視物件位址0x0036f7bc,其記憶體前四個位元組正好是虛函式表的位址0x011a9c80(由於inter處理器是小端模式,所以位元組序看起來剛好相反)。

檢視虛函式表位址處的記憶體0x011a9c80,可以看到物件c包含的虛函式的具體位址,其中第乙個和第三個為基類base的a、c函式位址,第二個為子類child的b函式位址。

虛函式表指標儲存在物件起始位址的前4位元組(x64為8位元組),其後緊跟的為成員變數。注意,前4位元組是只儲存了物件的虛函式表的位址,虛函式表儲存在該位址指向的位址區。

C 虛函式原理

簡單地說,每乙個含有虛函式 無論是其本身的,還是繼承而來的 的類都至少有乙個與之對應的虛函式表,其中存放著該類所有的虛函式對應的函式指標。例 其中 從編譯器的角度來說,b的虛函式表很好構造,d的虛函式表構造過程相對複雜。下面給出了構造d的虛函式表的一種方式 僅供參考 以下面的程式為例 編譯器只知道p...

C 虛函式原理

類中的成員函式分為靜態成員函式和非靜態成員函式,而非靜態成員函式又分為普通函式和虛函式。q 為什麼使用虛函式 a 使用虛函式,我們可以獲得良好的可擴充套件性。在乙個設計比較好的物件導向程式中,大多數函式都是與基類的介面進行通訊。因為使用基類介面時,呼叫基類介面的程式不需要改變就可以適應新類。如果使用...

c 虛函式實現原理簡單剖析

虛函式在c 裡的作用是在是非常非常的大,很多講述c 的文章都會講到它,要用好c 就一定要學好虛函式。本文對虛函式的一些實現機制,以及c 物件布局做一下探索。虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重...