c vtable 虛函式表

2021-08-14 04:54:29 字數 1043 閱讀 7352

1.作用:

用於有虛函式物件的指標,其在執行期間決定實際應該執行的函式的位址

2.記憶體布局:

記憶體的開頭位置(64位),即記憶體開頭8位元組內容為vtable的的位址值

而vtable順序存放函式位址值(64位順序陣列)

3.**呼叫:

#include #include class p 

virtual void testa()

private:

int a;

};class s : public p

void testc()

private:

int c;

};int main()

void *ptr = (void*)(*((long*)p)); 獲取到vtable的位址

void (*fun)(void) = (void(*)(void))(*((long*)ptr));獲取函式指標

注:

1.只有擁有virtual的類的物件才會有vtable,對於非virtual的函式,在編譯器就能直接指定呼叫,而無需額外操作來得到

case:

析構函式為什麼一般需要virtual;

假設p是s的父類,那麼預設情況下s的析構函式生成的**會自動包含呼叫父類析構函式的**,

這也就能說明當使用s s;等本地變數的時候,其是能夠處理完自己的析構函式再自動呼叫父類的析構函式(建構函式則相反),即**已經在子類的析構函式中,

但是當用p *p = new s();的時候,如果p的析構函式不是virtual的,那麼會只有析構~p函式,這是因為,~p()並不是虛函式,那麼不會在vtable中,其決定析構函式的呼叫,

在編譯期間便根據p的型別,直接只呼叫~p的

那麼當~p為虛函式的時候,~p是作為vtable的函式的,當其指向s()的時候,其~p()的函式實際是指向~s()的,因此便能完成析構函式的正確呼叫。

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...

虛函式表和虛函式表的指標

有虛函式的類都有乙個虛函式表,它是實現多型的關鍵。虛函式表可以繼承,如果子類沒有重寫虛函式,那麼子類虛函式表中仍然會有該函式的位址,只不過這個位址指向的是基類的函式實現。如果子類重寫了相應的虛函式,那麼虛函式表中的位址就會改變,指向自身的函式實現。如果派生類中有自己的虛函式,那麼虛函式表中會新增該項...

虛函式之虛函式表

多型性可分為兩類 靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,動態多型性是通過虛函式實現的。每個含有虛函式的類有一張虛函式表 vtbl 表中每一項是乙個虛函式的位址,也就是說,虛函式表的每一項是乙個虛函式的指標。沒有虛函式的c 類,是不會有虛函式表的。兩張圖 簡單例子 inclu...