構造函數不能宣告為虛函數的原因:
1,所謂虛函數就是多態情況下只執行一個,而從繼承的概念來講,總是先構造父類對象,然後才能使子類對象,如果建構函式設為虛函數,那麼你在建構父類別的建構函式時就必須顯式的呼叫構造,還有一個原因就是為了防錯誤的發生,試想如果你在子類別中一不小心重寫了個跟父類別建構函數一樣的函數,那麼你的父類別建構子將會被覆蓋,也也就是不能完成父類別的構造,就會出錯。
class A
{
public :
virtual A()
}
};
class B: public A
{
cout cout cout }
派生類別繼承從而產生多態,衍生類別的建構函式中,編譯器會加入建構基底類別的程式碼,如果基底類別的建構函式用到了參數,則衍生類別在其建構函式中必須為基底類別給出參數,就是這個原因,原因有點繞,就是說如果派生類別的建構子必須跟父類別一摸一樣,這顯然是不符合實際的
當然還有其他的解釋:1,從儲存空間角度,虛函數對應一個vtable,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函數是虛的就需要透過vtable來調用,可是物件還沒有實例化,也就是記憶體空間還,沒有,無法找到vtable,所以建構子不能為虛函數。