установить указатель vtable соответственно
Эта часть почти полностью определяется реализацией. Ваш компилятор может не использовать vtables. Может быть несколько указателей vtable или один или несколько указателей на вещи, которые не являются vtables. Многократное наследование всегда интересно, как и виртуальные базовые классы. Эти метаданные не гарантируются для копирования с memcpy
в другой объект, поэтому указатели не должны быть абсолютными. Там могут быть смещения, относящиеся к самому указателю объекта.
IIRC обычно происходит, когда вызывается конструктор базового класса, затем указатель vtable устанавливается на базовый класс, затем вызывается первый конструктор производного класса и т. Д. Это делается для того, чтобы удовлетворить требования спецификации, что происходит, когда виртуальная функция вызывается в конструкторе. Насколько я помню, в стандарте нет "списка действий", есть только определенный порядок инициализации.
Таким образом, невозможно обобщить, что делает реализация, тем более что то, что у вас есть, не является реализацией стандарта C ++. Если он срезает углы, пропуская «новое», вероятно, по уважительной причине, потому что думает, что вы не должны использовать его на целевой платформе, тогда кто знает, какие другие правила языка он игнорирует. Если можно было смоделировать «новое» с помощью malloc и небольшого нажатия указателя, то почему же компилятор не просто реализует новое? Я думаю, что вам нужно задавать вопросы, помеченные вашим конкретным компилятором и платформой, чтобы ответить могли все эксперты вашего компилятора.