Существует определенная зависимость от точного класса.
Помните, что C ++ имеет множественное наследование (MI). Следствием MI является то, что один объект может иметь несколько базовых подобъектов. Те, конечно, не могут быть по одному адресу. Это также означает, что некоторые базовые подобъекты на самом деле не начинаются с относительного смещения 0.
Теперь этот MI вносит некоторые сложности в vtables: вы наследуете функции от нескольких баз с разными смещениями. По этой причине довольно распространено использовать разные макеты vtable для классов MI.
В соответствующей заметке MI также означает, что не каждый указатель на объект на самом деле является указателем на начало этого объекта. Вполне вероятно, что указатель SecondBase*
на объект Derived
смещен на sizeof(FirstBase)
, то есть указывает где-то посередине объекта Derived
.