// virtual func
...
};
Transaction::Transaction(const std::string& logInfo)
{
...
logTransaction(logInfo); // now a non-
} // virtual call
class BuyTransaction: public Transaction {
public:
: Transaction(createLogString( parameters )) // pass log info
{ ... } // to base class
... // constructor
private:
static std::string createLogString( parameters );
};
换句话说,因为在基类的构造过程中你不能使用虚函数,就改为由派生类传递必要的构造信息给基类的构造函数作为补偿。 在此例中,注意 BuyTransaction 中那个(私有的)static 函数 createLogString 的使用。使用一个辅助函数创建一个值传递给基类的构造函数,通常比通过在成员初始化列表给基类它所需要的东西更加便利(也更加具有可读性)。将那个函数做成 static,就不会有偶然涉及到一个初生的 BuyTransaction 对象的仍未初始化的数据成员的危险。这很重要,因为实际上那些数据成员在一个未定义状态,这就是为什么在基类构造和析构期间虚函数不能首先匹配到派生类的原因。
Things to Remember
在构造和析构期间不要调用虚函数,因为这样的调用不会匹配到当前执行的构造函数或析构函数所属的类的更深的派生层次。