Во многих источниках книги и т. Д. Написаны «не называйте this-> virtualFunction в конструкторе дочерних классов», и в некоторых источниках объясните, почему вы не должны этого делать. Потому что на момент строительства класс вообще не создан. Таким образом, виртуальная функция, которая будет вызываться из дочернего конструктора, будет функцией базового класса. Это означает, что в блоке конструктора child VPTR этого класса указывается на базу VTABLE.Детский конструктор C++ и VPTR
Так что мой вопрос:
Какой момент в построении объекта, когда VPTR дочернего класса будет переопределен, чтобы адресовать его виртуальную таблицу? Я предполагаю, что какой-то автоматически сгенерированный код сделает это в конце тела конструктора или после того, как будет обработан тело конструктора.
И второй вопрос:
Почему VPTR переопределяется в конце строительства? Может быть, у него есть некоторые важные причины? Почему не удается переопределить VPTR в начале тела конструктора или после создания базового класса?
Child::Child() :
Base()
//<----- Why not here?
//members initialization
{
//<----- Why not here?
//code
}
Внутри тела конструктора 'Child' нет динамического типа' Child', а не 'Base'. Это 'Base' внутри конструктора' Base'. (Я не совсем уверен, меняется ли он до или после инициализации членов «Child», поэтому я не могу дать полный ответ). –
Возможный дубликат [Можно ли вызвать виртуальную функцию для инициализации под-объекта базового класса?] (Http://stackoverflow.com/questions/25754796/may-i-call-a-virtual-function-to-initialize -a-base-class-sub-object) – Deduplicator
@ravi стандарт явно позволяет вызывать виртуальные функции от конструктора, это просто считается ужасной практикой. – IdeaHat