C 原理剖析之虛函式表

2021-09-26 03:05:34 字數 1829 閱讀 7673

最近在看c++的一些相關的機制,再加上剛看了陳皓大神的早期關於虛函式表的部落格,便自己動手通過程式設計了解了下虛函式表的原理。

c++是通過虛函式來實現多型的的機制。我們可以通過將父類的指標指向子類的例項,如base b = new derive(),如此一來,如果子類derive中過載了父類中的乙個函式h(),那麼呼叫b->h()等同於呼叫derive dd->h()。我們這裡來剖析下虛函式表的實現機制。

我們可以通過程式設計來對虛函式表的內部結構來一窺究竟。如下**:

#include

using

namespace std;

class

base

virtual

voidg(

)virtual

voidh()};

我們構造了乙個基類,定義了三個虛函式f(),g(),h(),分別輸出對應的描述。我們通過以下**來得到該基類的虛函式表位址,和虛函式表中各個函式的位址。

int

main()

我的機器是64位系統,其中函式指標大小為16位,因此使用long*強轉。執行結果如下:

int

main()

結果如下:

base::f

base::g

base::h

由此我們可知該基類的虛函式表的結構應該是這樣:

我們來分析單繼承有子類的情況,而且該子類有自己的虛函式,並無對父類的函式進行重寫。資料結構如下:

class

base

virtual

voidg(

)virtual

voidh(

)};class

derive

virtual

voidg1(

)virtual

voidh1()};

通過程式設計驗證可知,其父類的虛函式表沒有變化,其子類的虛函式表是這樣:

如果其子類有函式重寫的情況,如下資料結構:

class

base

virtual

voidg(

)virtual

voidh(

)};class

derive

virtual

voidg1(

)virtual

voidh1()};

可以看出子類重寫了父類的 f 函式,這時候再看子類的虛函式表結構:

不妨程式設計驗證一下:

int

main()

結果:

derive::f
待續,,,

C 虛函式表剖析

為了實現c 的多型,c 使用了一種動態繫結的技術。這個技術的核心是虛函式表 下文簡稱虛表 本文介紹虛函式表是如何實現動態繫結的。每個包含了虛函式的類都包含乙個虛表。我們知道,當乙個類 a 繼承另乙個類 b 時,類a會繼承類b的函式的呼叫權。所以如果乙個基類包含了虛函式,那麼其繼承類也可呼叫這些虛函式...

C 虛函式表剖析

為了實現c 的多型,c 使用了一種動態繫結的技術。這個技術的核心是虛函式表 下文簡稱虛表 本文介紹虛函式表是如何實現動態繫結的。每個包含了虛函式的類都包含乙個虛表。我們知道,當乙個類 a 繼承另乙個類 b 時,類a會繼承類b的函式的呼叫權。所以如果乙個基類包含了虛函式,那麼其繼承類也可呼叫這些虛函式...

C 虛函式表原理

一 概述 為了實現c 的多型,c 使用了一種動態繫結的技術。這個技術的核心是虛函式表 下文簡稱虛表 本文介紹虛函式表是如何實現動態繫結的。二 類的虛表 每個包含了虛函式的類都包含乙個虛表。我們知道,當乙個類 a 繼承另乙個類 b 時,類a會繼承類b的函式的呼叫權。所以如果乙個基類包含了虛函式,那麼其...