------------恢复内容开始------------
我们想象这样一个情况,有一个基类base,和派生类A,在基类中,有一个虚函数log,并且在A中重载了这个虚函数log。我们在base的构造函数中,调用了这个虚函数log。
当我们创建一个A的实例时,会发生什么呢。
无疑会有一个A的构造函数调用,但是base类的构造函数会被更早调用。
derived class对象内的base class成分会在自身成分构造之前,先构造妥当,那么在base类的构造函数中,调用了虚函数log,这里就是引发惊奇的起点。
这里调用的log函数是base内的版本,不是A内的版本,即使要建立的对象类型是A。
在base class构造期间 virtual 函数绝不会下降到derived层次。
(如果你执行的是derived层次的虚函数,而derived class中的成员变量没有初始化,那就会导致不明确行为)
在derived class对象的base class构造期间,对象的类型其实是base class而不是derived class。
相关条款在第09条 《Effective C++》有更加详细的说明。
总之提炼原因是
在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class
------------恢复内容结束------------