"在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class"
class base{
public:
base();
virtual void log() const = 0;
};
base::base()
{
...
log();
}
class derived:public base{
public:
virtual void log() const;
};
当声明一个derived对象时:derived d;
会首先调用基类的构造函数,然后再构造derived自身的成分。而基类的构造函数会调用log(),但是其调用的是base里的,而不是derived里的log()。也即,base class构造期间,virtual函数绝不会下降到derived class阶层。比较形象的解释是:在base class构造期间,virtual函数不是virtual函数。
实际上,在derived class对象的base class构造期间,对象的类型是base class而不是derived class。不只virtual函数会被编译器解析至base class,若使用运行期的类型信息,也会把对象视为base class类型。