2010-09-11 80 views
2

我聽說很多時候虛擬功能通常是用vtable實現的。但我其實並不知道它是如何實現的以及它是如何工作的。虛擬關鍵字內部組件

編輯

我實際上並沒有得到這個代碼:怎麼會被改寫。有人可以詳細解釋這一點嗎?

最後,讓我們看看編譯器如何實現對虛函數的調用。您的代碼可能是這樣的:

// Your original C++ code 

void mycode(Base* p) 
{ 
    p->virt3(); 
} 

編譯器不知道這是否會調用Base::virt3()Der::virt3()或者是另一個派生類甚至不存在尚未的virt3()方法。它只知道你正在呼叫virt3(),這正好是v表中第3槽的功能。它改寫這一呼籲弄成這個樣子:

// Pseudo-code that the compiler generates from your C++ 

void mycode(Base* p) 
{ 
    p->__vptr[3](p); 
} 
+0

http://en.wikipedia.org/wiki/Vtable – Potatoswatter 2010-09-11 12:51:29

回答

0

常見的實現是在指向vtable的對象的每個實例的開始處都有一個指針。每個班級有一個vtable,所以如果你有一個班級A和班級B,每個班級會有一個表格。

vtable基本上有一堆函數指針,所以如果類A有兩個虛函數foo()和bar(),表中將有兩個指針。如果B類重寫這兩個函數,它的版本foo()和bar()會有相同的偏移量。

0

瞭解vtable如何工作的一個簡單方法是使用函數指針在C中實現相同類型的功能,因爲vtable的功能都是指向具體實現的函數指針表。