Item 09-絕不在構造函數和析構函數中調用virtual函數(Never call virtual functions during construction or destruction)
Why?
由於base class構造函數的執行更早於derived class構造函數,當base class構造函數執行derived class的成員變量尚未初始化。如果期間調用的virtual函數下降至derived class階層,要知道derived class的函數幾乎必然取用local成員變量,而那些成員變量尚未初始化。這會導致不明確行為。
根本的原因:在derived class對象的base class構造期間,對象的類型是base class而不是derived class。
析構函數同理,一旦derived class析構函數開始執行,對象內的derived class成員變量遍未呈現未定義值,所以C++視它們仿佛不存在。進入base class析構函數後對象就成為一個base class對象,而C++任何部分包括virtual函數,dynamic_casts等等也就那麼看待它。
請記住:
在構造和析構期間不要調用virtual函數,因為這類調用從不下調至derived class(比起當前執行構造函數和析構函數的那層)。