虛表。
每一個有虛函式的類都有這樣一個東西。
它實際上記錄了本類中所有虛函式的函式指針,也就是說是個函式指針數組的起始位置。
比如virtual void TheSecondFun()記錄在數組的第二個元素,當一個該類的對象實例調用TheSecondFun時就根據對應關係把第二個函式指針取出來,再去執行該函式,這種行為叫晚綁定,也就是說在運行時才知道調用的函式是什麼樣子的,而不是在編譯階段就確定的早綁定。
虛函式的處理:
通常是由虛函式表(vtable)來實現的。
虛函式表的結構:它是一個函式指針表,每一個表項都指向一個函式。任何一個包含至少一個虛函式的類都會有這樣一張表。需要注意的是vtable只包含虛函式的指針,沒有函式體。實現上是一個函式指針的數組。虛函式表既有繼承性又有多態性。每個派生類的vtable繼承了它各個基類的vtable,如果基類vtable中包含某一項,則其派生類的vtable中也將包含同樣的一項,但是兩項的值可能不同。如果派生類覆寫(override)了該項對應的虛函式,則派生類vtable的該項指向覆寫後的虛函式,沒有覆寫的話,則沿用基類的值。
每一個類只有唯一的一個vtable,不是每個對象都有一個vtable,恰恰是每個同一個類的對象都有一個指針,這個指針指向該類的vtable(當然,前提是這個類包含虛函式)。那么,每個對象只額外增加了一個指針的大小,一般說來是4位元組。
在類對象的記憶體布局中,首先是該類的vtable指針,然後才是對象數據。
在通過對象指針調用一個虛函式時,編譯器生成的代碼將先獲取對象類的vtable指針,然後調用vtable中對應的項。對於通過對象指針調用的情況,在編譯期間無法確定指針指向的是基類對象還是派生類對象,或者是哪個派生類的對象。但是在運行期間執行到調用語句時,這一點已經確定,編譯後的調用代碼能夠根據具體對象獲取正確的vtable,調用正確的虛函式,從而實現多態性。
例:
實現多態:
class a
{
public:
virtual void fun1();
vitrual void fun2();
private:
int i;
}
class b : public a
{
public:
virtual void fun2();
virtual void fun3();
private:
int j;
}
則class a 的記憶體layout為(win32 platform)
begin of layout of class a
vtable pointer (pointer to vtable of class a see below) (4 bytes)
int i (4 bytes)
end of layout of class a
vtable of class a
begin of vtable of class a
start address of a::fun1 (4 bytes)
start address of a::fun2 (4 bytes)
end of vtable of class a
class b 的記憶體layout為(win32 platform)
begin of layout of class b
vtable pointer (pointer to vtable of class b see below) (4 bytes)
int i (4 bytes)
int j (4 bytes)
end of layout of class b
vtable of class b
begin of vtable of class b
start address of a::fun1 (4 bytes)
start address of b::fun2 (4 bytes)
start address of b::func3 (4 bytes)
end of vtable of class b
所以才有
a* p = new b;
p->fun2() 調 b::fun2()
相關詞條
-
vtable
虛函式的類都有的一個虛表。
-
面向對象語言
vtable了?)。直觀地看,方法的代碼可以被嵌入各個單個對象中,而且...++的vtable就是這種方法)而對於動態類型的語言,(也就是說,父子類的關係...
產生和發展方向 主要特點 特殊語言 區分方法 -
雙重接口
使用自定義接口時,由接口定義的那些方法都被定義在一個vtable中。對於vtable來說,只有那些方法入口才是有用的。方法的順序被定義在接口中...加了一些新的方法到vtable中(見圖4-6)。只知道IDispatch...
-
MFC程式映射庫
簡介 當提及 OnLButtonDown 成員早先例子的應用程式的功能的時候。你可能認為 OnLButtonDown 是一個...
簡介 說明 -
面向對象化語言
的過程負責找到正確的方法的代碼。(譯者按:是不是想起了vtable...
基本概念 類和對 方法解析 子類和繼承 類型信息 -
DCOM
使用Microsoft Distributed Component Object Model(DCOM)是Component O...
使用 概念 分散式 結構 組件復用 -
函式隱藏
。vtable此時派生類vtable中的函式指向基類版本的函式地址。同時這個...
-
ActiveX Data Objects
簡介ADO (ActiveX Data Objects,ActiveX數據對象)是Microsoft提出的應用程式接口(API)...
簡介 定義 從 ASP 頁面訪問資料庫 對象總結 接口簡介 -
ADO
ADO (ActiveX Data Objects,ActiveX數據對象)是Microsoft提出的應用程式接口(...