虛函式表又是怎樣實現的?

2021-08-25 10:11:59 字數 678 閱讀 7455

每個含有虛函式的類有一張虛函式表(vtbl),表中每一項指向乙個虛函式的位址,實現上是乙個函式指標的陣列。

虛函式表既有繼承性又有多型性。每個派生類的vtbl繼承了它各個基類的vtbl,如果基類vtbl中包含某一項,則其派生類的vtbl中也將包含同樣的一項,但是兩項的值可能不同。如果派生類覆蓋(override)了該項對應的虛函式,則派生類vtbl的該項指向過載後的虛函式,沒有過載的話,則沿用基類的值。

在類物件的記憶體布局中,首先是該類的vtbl指標,然後才是物件資料。在通過物件指標呼叫乙個虛函式時,編譯器生成的**將先獲取物件類的vtbl指標,然後呼叫vtbl中對應的項。對於通過物件指標呼叫的情況,在編譯期間無法確定指標指向的是基類物件還是派生類物件,或者是哪個派生類的物件。但是在執行期間執行到呼叫語句時,這一點已經確定,編譯後的呼叫**能夠根據具體物件獲取正確的vtbl,呼叫正確的虛函式,從而實現多型性。

分析一下這裡的思想所在,問題的實質是這樣,對於發出虛函式呼叫的這個物件指標,在編譯期間缺乏更多的資訊,而在執行期間具備足夠的資訊,但那時已不再進行繫結了,怎麼在二者之間作乙個過渡呢?把繫結所需的資訊用一種通用的資料結構記錄下來,該資料結構可以同物件指標相聯絡,在編譯時只需要使用這個資料結構進行抽象的繫結,而在執行期間將會得到真正的繫結。這個資料結構就是vtbl。可以看到,實現使用者所需的抽象和多型需要進行後繫結,而編譯器又是通過抽象和多型而實現後繫結的.

虛函式(虛函式表vtable 的實現

乙個動態的鏈結究竟怎樣實現的呢?首先,如果乙個基類中有虛函式,則編譯器自動生成乙個指向虛函式位址的表。有 幾個虛函式,對應的虛函式表 vftable 的長就是幾。然後,在基類中生成乙個指向虛函式表的指標。對應的每個虛函式由編譯器將其對映為虛函式表指標 vfptr 加上乙個數字 這個數 字就是真正的虛...

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...

虛函式表實現理念

每個包含了虛函式的類都包含乙個虛表。我們知道,當乙個類 a 繼承另乙個類 b 時,類a會繼承類b的函式的呼叫權。所以如果乙個基類包含了虛函式,那麼其繼承類也可呼叫這些虛函式,換句話說,乙個類繼承了包含虛函式的基類,那麼這個類也擁有自己的虛表。個人理解 用父類指標指向子類物件時,如果基類中有虛函式,那...