一般位於物件的最前端,但是並不一定是這樣的,這是由編譯器決定的。
c++中虛函式是通過一張虛函式表(virtual table)來實現的,在這個表中,主要是乙個類的虛函式表的位址表;這張表解決了繼承、覆蓋的問題。在有虛函式的類的例項中這個表被分配在了這個例項的記憶體中,所以當我們用父類的指標來操作乙個子類的時候,這張虛函式表就像一張地圖一樣指明了實際所應該呼叫的函式。
c++編譯器是保證虛函式表的指標存在於物件例項中最前面的位置(是為了保證取到虛函式表的最高的效能),這樣我們就能通過已經例項化的物件的位址得到這張虛函式表,再遍歷其中的函式指標,並呼叫相應的函式。
一般繼承(有函式覆蓋)
多重繼承(無函式覆蓋)
多重繼承(有函式覆蓋)
詳細的可以學習下面的鏈結。
**:
虛函式呼叫及實現
摘自 c c 虛函式實現的基本原理 1.概述 簡單地說,每乙個含有虛函式 無論是其本身的,還是繼承而來的 的類都至少有乙個與之對應的虛函式表,其中存放著該類所有的虛函式對應的函式指標。例 其中 2.虛函式表構造過程 3.虛函式呼叫過程 以下面的程式為例 編譯器只知道pb是b 型別的指標,並不知道它指...
c 虛函式及static的記憶體分配情況
class gfather void b void c c 呼叫虛函式的時候,要根據例項 即this指標指向的例項 中虛函式表指標得到虛函式表,再從虛函式表中找到函式的位址。沒有virtual關鍵字,sizeof father 占用1位元組,有virtual關鍵字,sizeof father 占用4...
C 虛函式及虛函式表詳解
多型 的關鍵在於通過基類指標或引用呼叫乙個虛函式時,編譯時不確定到底呼叫的是基類還是派生類的函式,執行時才確定。include using namespace std class a virtual void func2 class b public a int main 在 32 位編譯模式下,程...