QUESTION 1)
class Base {
Base(std::string name);
virtual std::string generateName();
}
class Derived : Base {
Derived();
virtual std::string generateName();
}
here comes the question :
what method will be called on generateName() ?
Derived :: Derived : Base(generateName()) {
//what method will be called on generateName() ?
}
QUESTION 2)
how should i make it? if the default constructor must accept a parameter, but i need to generate that parameter in the Derived constructor?
Take two...
I did a run with calls to
generateName()
in the base class initialiser and both constructors. The output left me nonplussed:I never imagined that a class could morph from being a derived to a base, then back to a derived in a single construction sequence. You learn something new every day.
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):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.