Обычно вызов виртуальных функций из конструкторов считается плохой практикой, поскольку переопределенные функции в под-объектах не будут вызываться, поскольку объекты еще не построены.
Но рассмотрим следующие классы:
class base
{
public:
base() {}
~base() {}
private:
virtual void startFSM() = 0;
};
class derived final : public base
, public fsm_action_interface
{
public:
derived() : base{}
, theFSM_{}
{ startFSM(); }
/// FSM interface actions
private:
virtual void startFSM()
{ theFSM_.start(); }
private:
SomeFSMType theFSM_;
}
В этом случае класс derived
помечен как final
, поэтому никаких дополнительных под-объектов не существует. Ergo виртуальный вызов будет корректно разрешен (для самого производного типа).
До сих пор считается плохой практикой?