Предположим, кто-то унаследовал сложную кодовую базу (в Visual C ++, предположим, 2003 или, возможно, позже) с большим и сложным графом наследования. Предположим, это глубоко, и есть много виртуальных функций и, возможно, даже множественного наследования. (Да, немного кошмар обслуживания). Любая попытка преобразовать эту иерархию классов во что-то более разумное должно будет знать, какую реализацию каждой виртуальной функции использует каждый класс.
Если мы возьмем произвольный листовой класс L1 - который происходит от базового класса B1, который происходит от базового класса B2 и т. Д. - он явно будет иметь vtable для класса, который будет показывать что-то вроде (псевдо-vtable):
L1::F1
B3::F2
B1::F3
L1::F4
etc.
... в зависимости от того, какие именно виртуальные функции были переопределены каким классом.
Как можно увидеть такой vtable в такой же форме? Было бы возможно восстановить его вручную, читая код, но это подвержено ошибкам и трудоемко. Предположительно также, взлом объекта класса в отладчике может позволить вам проверить виртуальную таблицу в окне Watch с помощью указателя виртуальной таблицы для этого одного класса, но это неудобное решение, особенно если вы хотите также увидеть виртуальные таблицы для L2, L3, ... LN.
Предоставляет ли DbgHelp.dll средства для проверки виртуальных таблиц программно (позволяя вывод в любой форме)? Или есть какой-то другой метод?