一種「標準」的虛函式機制簡介

2021-08-29 10:50:20 字數 651 閱讀 9674

編譯器是如何針對

虛函式產生可以再執行時刻確定被呼叫函式的**呢?也就是說,虛函式實際上是如何被編譯器處理的呢?lippman在深度探索c++物件模型中的不同章節講到了幾種方式,這裡把「標準的」方式簡單介紹一下。

我所說的「標準」方式,也就是所謂的「vtable」機制。編譯器發現乙個類中有被宣告為virtual的函式,就會為其搞乙個虛函式表,也就是vtable。

vtable實際上是乙個函式指標的陣列,每個虛函式占用這個陣列的乙個slot。

乙個類只有乙個vtable,不管它有多少個例項。派生類有自己的vtable,但是

派生類的vtable與基類的vtable有相同的函式排列順序,同名的虛函式被放在兩個陣列的相同位置上。在建立類例項的時候,編譯器還會在每個例項的記憶體布局中增加乙個vptr欄位,該欄位指向本類的vtable。通過這些手段,編譯器在看到乙個虛函式呼叫的時候,就會將這個呼叫改寫,針對1.1中的例子:

void bar(a * a)

會被改寫為:

void bar(a * a)

因為派生類和基類的foo()函式具有相同的vtable索引,而他們的vptr又指向不同的vtable,因此通過這樣的方法可以在執行時刻決定呼叫哪個foo()函式。

雖然實際情況遠非這麼簡單,但是基本原理大致如此。

虛函式的一種替代方案

虛函式的目的是實現物件的動態繫結,但是有些情況下,可能換一種替代方案,可能會使類的設計更加穩定,易用,下面列出乙個我認為很棒的虛函式的替代方案。使用non virtual inte ce nvi 手法,它以public non virtual 成員函式包裹較低訪問性的virtual函式 class ...

虛函式的機制

在c 中為了實現執行中的多型,需要滿足三個條件 類之間是派生關係 宣告基類 派生類的成員函式為虛函式 在滿足賦值相容性規則的前提下,通過指標或引用訪問虛函式。虛函式的為了實現動態聯編 執行多型 而引入的概念。動態聯編 dynamic binding 和靜態聯編 static binding 靜態聯編...

一種巧妙的取類的虛函式指標的方法

熟悉c 開發的朋友們都知道,每乙個包含虛函式的類的物件的前四個位元組 32位系統中,以下例子都是在32位系統下 的記憶體中存放著該物件的虛函式表的指標。虛函式表中依次存放著該物件的每個虛函式的位址。舉個例子 class testa testa testa testa testa void testa...