通常从构造函数中调用虚函数被认为是一种不好的做法,因为子对象中重写的函数在对象尚未构建完成时不会被调用。
但是,请考虑以下类:
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
,因此不会存在其他子对象。因此,虚函数调用将正确解析(到最派生的类型)。这仍然被认为是不良做法吗?
derived
不应该是final
了,会发生什么? - T.C.base
中的哪个方法通常调用startFSM
?这似乎很重要,这样我们才能做出完全明智的决定。 - Mark B