установить указатель vtable соответствующим образом
Эта часть почти полностью определяется реализацией. Ваш компилятор может не использовать vtables. Может быть несколько указателей vtable или один или несколько указателей на вещи, которые не являются vtables. Множественное наследование всегда интересно, как и виртуальные базовые классы. Не гарантируется возможность копирования этих метаданных с помощью memcpy
в другой объект, поэтому указатель(и) не обязательно должен быть абсолютным. Там могут быть смещения, которые относятся к самому указателю объекта.
IIRC обычно происходит так: вызывается конструктор базового класса, затем указатель vtable устанавливается на базовый класс, затем вызывается конструктор первого производного класса и т. д. Это делается для того, чтобы удовлетворить требования спецификации относительно того, что происходит, когда виртуальная функция вызывается в конструкторе. Насколько я помню, в стандарте нет "списка действий", только определенный порядок инициализации.
Поэтому невозможно обобщить, что делает реализация, тем более что то, что у вас есть, не является реализацией стандарта С++. Если он срезает углы, опуская «новое», по-видимому, по уважительной причине, потому что считает, что вы не должны использовать его на целевой платформе, то кто знает, какие еще правила языка он игнорирует. Если бы можно было смоделировать «новое» с помощью malloc и небольшого нажатия указателя, то с какой стати компилятор просто не реализует новое? Я думаю, вам нужно задавать вопросы, помеченные вашим конкретным компилятором и платформой, чтобы любой специалист по вашему компилятору мог ответить.
person
Steve Jessop
schedule
23.06.2009