Во-первых, решение: используйте статическую функцию-член или функцию, не являющуюся членом.
Что касается поведения, будет вызвано Derived::generateName()
.Длинное предложение в Стандарте C ++, которое определяет это поведение, говорит (C ++ 03 12.7 / 3):
Когда виртуальная функция вызывается прямо или косвенно из конструктора (в том числе из mem-initializer)для элемента данных) или из деструктора, и объект, к которому применяется вызов, является объектом, находящимся в процессе создания или уничтожения, вызываемая функция является той, которая определена в собственном классе конструктора или деструктора или в одной из его баз, но неФункция переопределяет его в классе, производном от класса конструктора или деструктора, или переопределяет его в одном из других базовых классов наиболее производного объекта.
Поскольку конструктор выполняется во время виртуальногоcall является конструктором Derived
, вызывается Derived::generateName()
.
Теперь удаленный ответ справедливо ссылается на статью Скотта Мейерса, в которой рекомендуется «Никогда не вызывать виртуальные функции во время строительства или разрушения». Правила вызова переопределителей сложны и трудны для понимания.помню.