要點:絕對不應(yīng)該在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù)。
Derived Class對象內(nèi)的Base Class成分會在Derived Class自身成分被構(gòu)造之前構(gòu)造完成。如果Base Class構(gòu)造函數(shù)中有虛函數(shù)(virtual function),該virtual function絕對不會下降到Derived Class層中,而是直接調(diào)用Base Class中該函數(shù),通俗的說,即——在Base Class構(gòu)造時,virtual function不再被當成virtual function。
這是因為,在Base Class構(gòu)造期間,對象的類型是Base Class而不是Derived Class。不只是虛函數(shù)會被編譯器解析至Base Class中,若使用運行期類信息(runtime type information,例如dynamic_cast和typeid),也會把對象視為Base Class類型。同樣這也適合于析構(gòu)函數(shù)。一旦由Derived Class的析構(gòu)函數(shù)進入到BaseClass的析構(gòu)函數(shù)后,對象就成為一個BaseClass的對象了。