1. 程式人生 > 其它 >第五章:建構函式

第五章:建構函式

  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()){};  //錯誤