要点:绝对不应该在构造函数和析构函数中调用虚函数。
Derived Class对象内的Base Class成分会在Derived Class自身成分被构造之前构造完成。如果Base Class构造函数中有虚函数(virtual function),该virtual function绝对不会下降到Derived Class层中,而是直接调用Base Class中该函数,通俗的说,即——在Base Class构造时,virtual function不再被当成virtual function。
这是因为,在Base Class构造期间,对象的类型是Base Class而不是Derived Class。不只是虚函数会被编译器解析至Base Class中,若使用运行期类信息(runtime type information,例如dynamic_cast和typeid),也会把对象视为Base Class类型。同样这也适合于析构函数。一旦由Derived Class的析构函数进入到BaseClass的析构函数后,对象就成为一个BaseClass的对象了。