假设你有个class继承体系,用来塑模股市交易如买进,卖出的订单等等.这样的交易一定要经过审计,所以每当创建一个交易对象,在审计日志中也要创建一笔适当的记录
class Transaction { public: Transaction(); virtual void logTransansaction() const = 0; Transaction::Transaction() { ... logTransansaction(); } class BuyTransaction: public Transaction { public: virtual void logTransaction() const; .... } class SellTransaction: public Transaction { public: virtual void logTransaction() const; .... }
?现在,当一下这行被执行,会发生什么事:
BuyTransaction b;
?五一地会有一个BuyTransaction构造函数被调用,但是首先Transaction构造函数一定会更早被调用.Transaction构造函数的最后一行调用virtual函数logTransaction,这正是引发惊奇的地方.这时候被调用的logTransaction是Transaction内的版本,不是BuyTransaction内的版本.没错!base class构造期间virtual函数绝不会下降到derived clases阶层.取而代之的是对象的作为像隶属base类型一样.非正式的说法或许比较传神:在base class构造期间,virtual函数不是virtual函数.是因为base class构造函数的执行早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化.