2011-07-03 112 views
14

我正嘗試完成其在上一個問題中描述的一樣:從基類構造函數調用派生類的虛函數?

virtual function call from base class

但是,我真正的問題是:

如果什麼f()是在基類的構造函數?哪個g()會被調用?我不知道我是否做錯了,但在我的程序中,似乎恰恰相反。

從以前的問題,以相同的變量,這說明這種

行爲看起來像這樣的代碼:

Class Base 

{ 

    Base(){g();}; 

    virtual void g(){//Do some Base related code;} 

}; 



Class Derived : public Base 

{ 

    Derived(){}; 

    virtual void g(){//Do some Derived related code}; 

}; 



int main() 

{ 

    Derived newDerived; 

    return 0; 

} 

更新:

感謝名單,以納文。

他向我提供了一個頁面,其中包含有關此主題的所有相關信息。

I'll讓你知道這裏的鏈接:

parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6

+0

你能展示一些展示這種行爲的示例代碼嗎? – jtbandes

回答

22

即使它是一個虛函數,基類的版本也會被調用,因爲派生類還沒有完全構造。基類構造函數在派生類構造函數之前被調用,所以如果派生的虛函數被調用,那將是一個不完全初始化的實例 - 一個可能的(可能)災難的配方。

+0

Thanx。這個解釋說服了我。 –

4

它將Base::g()。有關說明,請參閱此FAQ

1

當你的基類構造函數被調用時,只有基類的vtable被設置,所以任何虛函數調用都將只適用於基類方法。

當調用派生類構造函數時,調用虛函數將調用派生類覆蓋(如果有的話)。

1

虛擬機制在構造函數中不起作用,所以如果你甚至從基類構造函數調用虛函數,你總會最終調用基類的函數。虛擬funcs在ctors中不起作用有幾個原因:

  1. 雖然在構造函數中尚未完全創建該對象。
  2. 只有在編譯時才解析ctors調用,所以它們實際上沒有任何運行時依賴關係,因此不使用虛函數。
  3. 與其他函數不同,ctors和dtors不是繼承的,所以每個類都有它自己的ctors和dtors集合,所以不會有重寫的機會。
相關問題