Как можно проверить виртуальную таблицу в Visual C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как можно проверить виртуальную таблицу в Visual C++?

Сообщение Anonymous »

Предположим, кто-то унаследовал сложную кодовую базу (на Visual C++, предположим, 2003 года или позже) с большим и сложным графом наследования. Предположим, он глубокий, в нем много виртуальных функций и, возможно, даже множественное наследование. (Да, что-то вроде кошмара обслуживания). Любая попытка реорганизовать эту иерархию классов во что-то более разумное потребует знать, какую реализацию каждой виртуальной функции использует каждый класс.

Если мы возьмем произвольный листовой класс L1, который является производным из базового класса B1, который является производным от базового класса B2 и т. д. - у него явно будет виртуальная таблица для класса, которая будет отображать что-то вроде (псевдо-vtable):

Код: Выделить всё

L1::F1
B3::F2
B1::F3
L1::F4
etc.
...в зависимости от того, какие именно виртуальные функции каким классом были переопределены.

Как можно увидеть такая виртуальная таблица в такой форме? Можно было бы восстановить его вручную, прочитав код, но это чревато ошибками и трудоемко. Предположительно также, взлом объекта класса в отладчике может позволить вам проверить виртуальную таблицу в окне Watch с помощью указателя vtable для этого одного класса, но это неудобное решение, особенно если вы хотите также просмотреть виртуальные таблицы для L2, L3, ... LN.

Предоставляет ли DbgHelp.dll возможность программной проверки виртуальных таблиц (позволяя выводить данные в любой требуемой форме)? Или есть какой-то другой метод?

Подробнее здесь: https://stackoverflow.com/questions/302 ... n-visual-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»