要點:絕對不應該在構造函數和析構函數中調用虛函數。
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的對象了。