C 虛函式表例項分析

2022-09-27 02:03:18 字數 1120 閱讀 6211

多型是c++物件導向程式設計的乙個重要特性。以前看到虛函式覺得很神奇,為什麼就能實現多型了呢。最初的時候曾設想,要實現執行時多型,應該讓物件的某個部分始終指向乙個固定的位址,子類繼承的時候,就修改這個位址的內容。這樣,父類和子類都是到同乙個固定位址去讀取內容,在執行時就能表現不同行為。

在看了《深度探索c++物件模型》之後,發現思路是類似的。在物件中,有乙個指標指向一張虛函式表,裡面按照次序存放了每乙個虛函式,當子類繼承的時候,即到虛函式表的指定位置去修改函式位址。當我們通過父類指標來操作乙個子類的時候,呼叫虛函式,都是通過虛函式表+固定的偏移,這樣執行期多型便實現了

在深度《深度》這本書中,虛函式表大多放在了物件的末端,不知道現在的編譯器是什麼樣的,因此本文就來實際做個實驗測試一下。

實驗環境:vc2013 express

**如下:

class parent

virtual void a()

virtual void b()

virtual void c()

};class child : public parent

virtual void a()

virtual void b_child()

virtual void c_child()

};class grandchild : public child

virtual voidwww.cppcns.com a()

virtual void b_child()

virtual void c_grandchild()

};int main()

{ typedef void(*func)();

grandchild grandchild;

int **vtable = (int **)&grandchild;

for (int i = 0; (func)vtable[0][i] != nullptr; i++)

{ auto pfunc = (func)vtable[0][i];

cout << " ["<

結果顯示如下圖所示:

確實,虛函式表指標在物件起始處,並看到了對應項被覆蓋。

本文標題: c++虛函式表例項分析

本文位址:

虛函式表分析

project100.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include using namespace std 父類 class base virtual voidg virtual voidh class derive public bas...

深入分析C 虛函式表

c 中的虛函式 virtual function 是用來實現動態多型性的,指的是當基類指標指向其派生類例項時,可以用基類指標呼叫派生類中的成員函式。如果基類指標指向不同的派生類,則它呼叫同乙個函式就可以實現不同的邏輯,這種機制可以讓基類指標有 多種形態 它的實現依賴於虛函式表。虛函式表 virtua...

C 物件模型 虛函式表分析

class base virtual void g virtual void h class derive public base int main typedef void func void 定義乙個函式指標型別 func f func vptr 0 f就是函式指標變數。vptr 0 是指向第乙...