Разрешен ли вызов виртуальной конечной функции в фазе конструирования / разрушения в стандарте C ++?
Вызов виртуальной функции во время конструирования / уничтожения четко определен и полностьюдопустимо за исключением случая чисто виртуальных функций .
Запрещен вызов виртуальной функции в конструкторе и деструкторе
Не знаю (низаботится) кто говорит, что это «плохо» или «запрещено» с стилистической точки зрения, с точки зрения обслуживания кода ... Способность поддерживать код зависит, прежде всего, от хорошего знания соответствующего языка и инструментов;незнание того, что делают виртуальные вызовы на этих этапах (*), приведет к неправильному пониманию со стороны сопровождающих, что устраняется путем выбора более опытных сопровождающих и не сбивает с толку стиль программирования.
(*), которые не 'Технически это часть «времени жизни» объекта, которое даже не очень полезно, поскольку объекты могут использоваться и использоваться в их конструкторе (до начала их жизни) в любой нетривиальной программе (я думаю, что стандарт должен просто подавлятьэта ненужная концепция).
доступ к переменной подкласса, еще не инициализированной, может происходить в переопределенной версии виртуальной функции, которая объявлена в подклассе.
Itне может.При создании подобъекта базового класса B
(скажем, с помощью конструктора B::B()
), тип создаваемого объекта по определению B
.
переопределяетсяверсия виртуальной функции, которая объявлена в подклассе.
Нет, нет существующего объекта подкласса в этой точке , поэтому переопределения нет.
Хотя виртуальной конечной функции нет, она является конечной и нет возможности получить доступ к переменным подкласса.
Это не имеет значения.
Динамический тип полиморфного типаобъект устанавливается конструктором после конструкторов для базовых классов и до конструирования членов.
Если да, широко ли он применяется в большинстве компиляторов C ++?
На практикевсе компиляторы реализуют установку динамического типа объекта путем изменения одного или нескольких указателей vtable, чтобы они указывали на соответствующие vtables для типа;это делается как часть построения.
Это означает, что во время построения значение vptr изменяется при построении производных объектов.