effective c++ 条款9 do not call virtual function in constructor or deconstructor

时间:2023-03-09 00:28:20
effective c++  条款9 do not call virtual function in constructor or deconstructor

在构造函数中不要调用virtual函数,调用了也不会有预期的效果。

举个例子

class Transaction
{
public:
Transaction()
{
log();
}
virtual void log() =;
} 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函数

同理对析构函数。