First, the solution: use a static member function or a nonmember function.
As for the behavior, Derived::generateName()
will be called. The long sentence in the C++ Standard that defines this behavior says (C++03 12.7/3):
When a virtual function is called directly or indirectly from a constructor (including from the mem-initializer for a data member) or from a destructor, and the object to which the call applies is the object under construction or destruction, the function called is the one defined in the constructor or
destructor's own class or in one of its bases, but not a function overriding it in a class derived from the constructor or destructor's class, or overriding it in one of the other base classes of the most derived object.
Because the constructor being executed at the time of the virtual call is the Derived
constructor, Derived::generateName()
is called.
A now-deleted answer rightly referred to an article by Scott Meyers that recommends "Never Call Virtual Functions during Construction or Destruction." The rules for what overrider gets called are complex and difficult to remember.
generateName()
were being called from insideBase::Base
. But here, we are calling it in the initializer list, before we enterBase::Base
. Is this still true? – Dulci