假設一個人已經繼承了一個複雜的代碼庫(在Visual C++中,假設爲2003年或者更晚的版本),並帶有一個龐大而複雜的繼承圖。假設它很深,並且有很多虛函數,甚至可能有多重繼承。 (是的,有點維修的噩夢)。任何試圖將這個類層次結構重構爲更精確的東西都需要知道每個類使用的每個虛函數的實現。如何檢查Visual C++中的vtable?
如果我們取一個任意的葉類L1 - 它派生自基類B1,它派生自基類B2,等等 - 它顯然會有一個類的虛表,它將顯示類似於(僞虛表):
L1::F1
B3::F2
B1::F3
L1::F4
etc.
...取決於具體哪個虛擬函數被哪個類所覆蓋。
怎麼能看到這樣一個虛擬桌面形式很像這樣?通過閱讀代碼可以手工重構,但這很容易出錯並且很費力。據推測,在調試器中闖入類的對象可能允許您通過該類的vtable指針在Watch窗口中檢查vtable,但這是一個尷尬的解決方案,特別是如果您還想查看L2的vtable, L3,... LN。
DbgHelp.dll是否提供了以編程方式檢查vtables的功能(允許以任何形式輸出)?或者還有其他一些方法嗎?