今天在開發時遇到了乙個之前一直以為理所當然的建構函式問題。
先給總結:
子類在構造時,如果沒有顯式呼叫父類的建構函式,會先呼叫父類的預設建構函式(無引數的)
下面給出不同情況的例子
例子一:父類有預設的建構函式,子類的建構函式隨便
#include class base
};class derive:public base
};int main()
結果:編譯通過,暫時不能說明問題。
例子二:父類沒有預設的建構函式,子類的建構函式隨便
#include class base
};class derive:public base
};int main()
結果:編譯錯誤,錯誤資訊:[error] no matching function for call to 'base::base()'
說明,子類的構造需要先呼叫父類的預設建構函式
例子三:父類沒有預設的建構函式,子類的建構函式隨便,但是顯式呼叫了父類的建構函式
#include class base
};class derive:public base
};int main()
結果:編譯成功
說明,顯式呼叫父類的建構函式之後,不再呼叫父類的預設建構函式
例子四:父類沒有預設的建構函式,子類的建構函式與父類的引數列表相同,但是沒有顯式呼叫父類的建構函式
#include class base
};class derive:public base
};int main()
結果:編譯錯誤
說明,其實這種情況跟例子二的情況是一樣的,只不過父類跟子類的構造函式引數一樣,所以會給人感覺子類會呼叫父類相同引數的建構函式,但其實子類還是先呼叫父類的預設建構函式的。由於父類沒有預設的建構函式,所以編譯錯誤,錯誤資訊跟例子二一樣。
例子五(陷阱):父類跟子類的建構函式有相同的引數,且父類有預設的建構函式。子類沒有顯式呼叫父類的建構函式。
#include class base
base()
public:
int a;
};class derive:public base
};int main()
結果:編譯成功,執行輸出結果為:3674912
說明,這種情況跟例子四如出一轍,只不過由於父類有預設的建構函式,所以才會編譯成功。子類的帶乙個int引數的建構函式並沒有呼叫父類帶乙個int引數的建構函式。
最後,再來一次總結:上面五個例子說明了,如果子類的建構函式中沒有顯式呼叫父類的建構函式,則先預設呼叫父類的預設建構函式。
換句話說,在使用繼承時,如果父類沒有預設的建構函式,則子類的建構函式應當顯式地呼叫父類的自定義建構函式。
C 中繼承和建構函式
乙個類繼承自另外乙個類,他們的建構函式改怎麼辦?首先必須先宣告 建構函式是不能繼承的 我們先看一段 第一段 沒有建構函式,第二段有乙個,第三段有兩個。從他們的msil可以看出,有幾個建構函式就有幾個.ctor的il函式。即使你沒有建構函式,編譯器也會呼叫乙個空的建構函式。讓我們仔細瞧瞧msil 我們...
C 11中繼承建構函式和委派建構函式
1 繼承建構函式 在c 繼承中,我們可能會遇到下面這個例子 class base base char c m c c private int m value char m c class derived public base 那麼如果我們在構造b的時候想要擁有a這樣的構造方法的話,就必須乙個乙個的...
C 繼承中的建構函式問題
c 的繼承是不會整合建構函式的,但是子類在實現建構函式時會預設呼叫父類中的無參建構函式 想要不呼叫就要在子類中進行一些特殊操作 class program class person public person 子類需要呼叫父類的無參建構函式 public string name public int...