2014-12-06 87 views
0

我一直在尋找一種方式來直接通過指針訪問虛函數表和整個此帖一:http://www.codeproject.com/Tips/90875/Displaying-vtable-when-debuggingC++:幫助理解這行代碼

它工作正常,我可以通過虛函數表條目調用功能。 但我無法理解這行DEO的:

void (**vt)() = *(void (***)())ptr; 

ptr是指向一個對象。我怎樣才能破譯這一行,vt如何獲得vtable地址?

謝謝。

+0

相關:[嘗試此網站](http://cdecl.org)來解釋類型。 – WhozCraig 2014-12-06 11:58:44

回答

1

void (**vt)()
vt是指向某個函數的指針。這個函數返回void並且不帶任何參數。
void (***)()
指一個指針,指向指針指向這樣的功能(即,一個指針水平比上述大)。

首先,you're鑄造PTR這樣的三電平指針到功能。
然後,你得到它指向(跟單*)的東西,這是一個二級指針到函數,即。相同類型的變量vt。這意味着你可以將它分配給vt,並且這個線的功能非常強大。

爲什麼?

單個函數指針空隙無PARAM功能可以被存儲在這樣的變量x:void(*x)()。並不完全相關,如果你想傳遞一些數組到一個函數,你傳遞一個指針。 IE瀏覽器。它足以將數組地址存儲在指針中以訪問整個數組(如果長度已知)。
這意味着void(**vt)()可以存儲(地址)一個函數指針數組。
vtable不是別的,只是一個函數指針數組。

如果你有喜歡的顏色和虛函數表的某些變量的一類汽車,它使用如。每個對象200字節。指向汽車的指針就像指向200字節數組的指針,如果您訪問代碼中的顏色,編譯器會查找該顏色處於例如。字節133並生成對其的訪問。

其中vtable在此對象內部是實現定義的,但通常在開頭。如果你有一個指向汽車的指針,它是一個指向200字節的指針,首先被分成一些指針指針,然後是其他一些數據...

=> vtable,一組函數指針,從汽車的起始地址開始。
=>如果您將汽車指針投射到指向vtable的指針,即。指向「函數指針數組」的指針,即。指向「指向函數的指針的指針」,並且尊重你有vtable數組。

2

_vtable在對象中的實際位置依賴於編譯器。該代碼假定_vtable地址首先存儲在對象中(所有現代編譯器似乎都這樣做)。另外,每個類只有一個vtable,它存儲在一個單獨的位置。因此,每個實例都有一個指向函數指針數組的地址。

基本上,創建變量VT命名,即指針到返回void並且不採取任何參數的函數的陣列。然後,使用在對象的第一個成員(vtable的地址)中找到的內容初始化此變量。

(void (***)())ptr 

意味着你施放此第一4(32位機)或8(64位機)的指針的函數指針返回void和不帶參數的陣列。

*(void (***)())ptr 

返回那些4或8字節的內容,即vtable的地址。