Итак, я поиграл с Visual Studio Test Suite и обнаружил кое-что интересное:
У меня есть экземпляр для класса А по адресу, скажем, 0x0656a64c
,
Затем, когда я наблюдал за переменной, он говорит, что его __vfptr
указывает на 0x077e7c0c
,
Насколько я знаю, указатель виртуальной таблицы класса должен располагаться в первых 4 байтах (или 8 байтах в 64-битных приложениях) экземпляра класса, если только это не случай множественного наследования (тогда это просто смещения 1-го числа). адрес vtable).
Я заметил, что Visual Studio скомпилировал мой тест в .dll и динамически загружал свои инструменты для загрузки .dll.
Может ли это быть причиной различий в адресе?
Вот скриншот VS отладчика
Вы путаете адрес vptr и адрес, на который указывает vptr. Вы (примерно) правы, что обычная реализация состоит в том, что vptr является первым объектом в объекте, но Visual Studio показывает вам адрес виртуальные таблицы (который разделяется между всеми объектами класса).
Других решений пока нет …