C 中繼承中遇到的建構函式問題

2021-06-27 08:05:13 字數 1570 閱讀 6626

今天在開發時遇到了乙個之前一直以為理所當然的建構函式問題。

先給總結:

子類在構造時,如果沒有顯式呼叫父類的建構函式,會先呼叫父類的預設建構函式(無引數的)

下面給出不同情況的例子

例子一:父類有預設的建構函式,子類的建構函式隨便

#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...