在构造函数中不要调用virtual函数,调用了也不会有预期的效果。
举个例子
class Transaction { public: Transaction() { log(); } virtual void log() =0; } class BusinessTransaction: public Transaction { public: virtual void log() { ;//log something here } } BusinessTransaction b_trx;
b_trx 本意希望多态的调用BusinessTransaction的log函数。
然而这却是不可能的,
1 在BusinessTransaction调用构造函数时,先调用基类Transaction的构造函数,
2 这时在Transaction的构造函数中,并不知道其子类实现了log函数,所以会调用基类的log函数
3 也就是说在base class构造期间,virtual函数不是virtual函数
同理对析构函数。
effective c++ 条款9 do not call virtual function in constructor or deconstructor,布布扣,bubuko.com
effective c++ 条款9 do not call virtual function in constructor or deconstructor