第五章:建構函式
阿新 • • 發佈:2021-06-28
1.虛繼承體系下的建構函式
為了滿足虛繼承只有一個虛基類子物件的條件(即由最頂層的派生類呼叫虛基類的建構函式來初始化虛基類子物件),編譯器在建構函式中加入一個引數bool _most_derived來判斷是否是頂層派生類,如果是則呼叫拷貝建構函式。可能的偽碼如下。
Point3d *Point3d::Point3d(Point3d *this,bool _most_derived) { if(_most_derived) this->Point::Point(x,y); ... }
2.指向虛擬函式表的指標vptr的初始化
vptr初始化順序:在基類建構函式呼叫操作之後(包括虛基類和上一層基類的建構函式),在成員初始化列表中所列的成員初始化操作之前。
產生上述結果的原因是:如果我們在類Point3d的建構函式中呼叫一個虛擬函式size(),我們當然希望他是呼叫自己的那個size()而不是基類的。此時可以用靜態呼叫Point3d::size(),但是如果我們在size()中間再呼叫一個虛擬函式insize()呢,那insize()不能用靜態呼叫。此時只要還沒有初始化Point3d的虛擬函式表指標,那麼虛擬函式自然無法實現,即insize()只能呼叫Point3d::insize()了。
注意這個機制還不能處理以下情況:如果在Point3d的建構函式的初始化列表中,要給Point的建構函式提供一個虛擬函式作為引數,這樣是錯誤的,因為vptr不是沒有設定好,就是被設定指向錯誤的類(成員還沒初始化)
Point3d::Point3d():Point(size()){}; //錯誤