揭開C 類中虛表的「神秘面紗」

2021-09-09 02:19:00 字數 1681 閱讀 5115

c++類中的虛表結構是c++物件模型中乙個重要的知識點,這裡咱們就來深入分析下虛表的在記憶體中的結構。

c++乙個類中有虛函式的話就會有乙個虛表指標,其指向對應的虛表,一般乙個類只會有乙個虛表,每個虛表有多個」插槽」,每個插槽存放乙個虛函式的位址。插槽中的內容可以被覆蓋,子類如果重寫了父類中的虛函式,則插槽中對應位置的資料被覆蓋。虛表存放的是虛函式位址,不管該虛函式是public還是private的。光文字說明不太形象,下面上一張虛表結構的示例圖:

從圖中看出,虛表指標確實是指向虛表結構的,這個虛表結構中有許多插槽,每個插槽都會指向乙個虛函式。那麼如何用程式來測試呢,請接著看:

1 #include 2 #include 3

4using

namespace

std;56

class

base

1112

public:13

inta;

14};

1516

class derived : public

base

2122

public:23

intb;

24};

2526 typedef void (*pfunc)();

2728

intmain()

輸出結果:

注意,程式是在centos 7 64位系統下進行測試的。程式中直接提取出test虛函式位址,然後進行呼叫,發現呼叫的確實是derived.test函式,這也說明了虛表結構的記憶體布局。

虛表指標什麼時候賦值的?

1 #include 2

3using

namespace

std;45

class

base619

20virtual

void

show()

23public:24

intb;

25};

26class derived : public

base

2741

virtual

void

show()

44private:45

intd;

46};

4748

int main(int argc, char **ar**)

49

輸出結果為:

從輸出結果中可以得出,子類在構造過程中虛表指標會被賦值2次。初始化如下:

基類靜態成員 – 子類靜態成員 – (設定v_ptr/基類成員變數 ) –基類建構函式 – (設定v_ptr/子類成員變數) – 子類建構函式

在類的析構函式中是否對虛表指標進行賦值操作呢?

在子類的析構函式中,會把虛表指標設定為指向父類中的虛函式位址,這樣在父類的析構函式中呼叫虛函式實際上呼叫的是父類的虛函式,不過一般不這樣做。如何進行測試呢,按照上個問題的測試**,然後稍微改動一下就可以測試了。

參考:1、深入理解c++物件模型

2、《深度探索c++物件模型》

揭開MVC的神秘面紗

最近參加的高校平台專案中涉及到了 mvc。mvc,有人說是一種設計模式,也有人說是使用者介面層設計架構。那麼 mvc到底是什麼呢?今天我們一起來學習一下。mvc,即model view controller,把乙個應用的輸入 處理 輸出流程按照 model view controller 的方式進行...

揭開 const 的神秘面紗

const 變數 int main int a 10 可讀可寫 int b b a a的讀取許可權 b a 20 a的寫許可權 左值 放在賦值符號的左邊 1.const 定義常變數,將變數變成唯讀型的 int ca 10 可讀可寫 const int ca 10 加上const後,變成了唯讀型 ca...

揭開Mashup神秘的面紗

今天做繫分考試題時,遇到了乙個web應用的問題。mashup目前經常使用的mashup資料介面有那些啊?還有,在應用mashup時,進行內容聚合的物理位置很重要,目前很多mashup站點都選擇在客戶端機器上進行內容聚合,構成所謂的胖網際網路應用程式 ria 請問在客戶端進行內容聚合有什麼優點啊?ps...