我们设计一个class继承体系来模拟交易如买进、卖出的订单,对于每一笔交易,我们会在审计日志中创建相应的记录,也许我们会这样设计该class体系
class Transaction
{
public:
Transaction();
virtual void logTransaction() const = 0;
};
Transaction::Transaction()
{
cout << "Base Transaction" << endl;
logTransaction();
}
void Transaction::logTransaction() const
{
cout << "Base log" << endl;
}
class BuyTransaction : public Transaction
{
public:
BuyTransaction();
virtual void logTransaction() const;
};
BuyTransaction::BuyTransaction()
{
cout << "Buy Transaction" << endl;
}
void BuyTransaction::logTransaction() const
{
cout << "Buy log" << endl;
}
class SellTransaction : public Transaction
{
public:
SellTransaction();
virtual void logTransaction() const;
};
SellTransaction::SellTransaction()
{
cout << "Sell Transaction" << endl;
}
void SellTransaction::logTransaction() const
{
cout << "Sell log" << endl;
}
int main()
{
BuyTransaction b;
SellTransaction s;
return EXIT_SUCCESS;
}
很遗憾,结果是这样的:
Base Transaction
Base log ---结果不是Buy log
Buy Transaction
Base Transaction
Base log ---结果不是Sell log
Sell Transaction
造成这样的结果原因是:在derived class 对象的base class 构造期间,对象的类型是base class而不是derived class。base class构造期间virtul函数绝不会下降到derived classes阶层,取而代之的是,对象的作为就像隶属base类型一样。非正式的说法:在base构造期间,virtual函数不是virtual函数。
当然,我们可以在class Transaction内将logTransaction函数改为non-virtual,然后要求derived class构造函数传递必要信息给Transaction构造函数。