這裡先給出結論,在貼出**與執行結果~
乙個派生類建構函式的執行順序如下:
第一步執行:虛擬基類的建構函式(多個虛擬基類則按照繼承的順序執行建構函式)。
第二步執行:基類的建構函式(多個普通基類也按照繼承的順序執行建構函式)。
第三步執行:類型別的成員物件的建構函式(按照初始化順序)。
第四部執行:派生類自己的建構函式。
如果乙個派生類不僅繼承於乙個基類,而且還有這個基類的成員物件,那麼會進行兩次建構函式的執行(乙個用於初始化派生類中基類部分的內部成員,另乙個是初始化派生類的基類型別成員變數的內部成員),詳細看派生類son2的執行結果。
你下面宣告了
a,b,c,d,object1,object2
留個基類以及
son1
,son2
,son3
,son4
,son5
(son5
是乙個錯誤的例子,編譯不能通過)
每個基類都有兩個建構函式,預設的建構函式不接受引數,輸出的
default+
字串帶引數的輸出的自己類的特有資訊。
(為了方便**,我在後面會再貼一下結論)
參考son1:可以驗證上述派生類建構函式的執行順序;
參考son2:可以驗證建構函式是嚴格照上面所說的順序執行,與初始化的順序無關。同時,如果不顯示的執行基類建構函式的初始化,就會按照順序呼叫預設的建構函式。
參考son3
:可以說明繼承下執行的建構函式與類型別的成員變數的建構函式是占用兩個不同的記憶體位址空間,二者不會相互影響。
參考son4:可以說明,無論是否顯示的初始化類型別的成員變數,都會按照成員變數在類中的宣告順序執行建構函式。
參考son5:這個解決了我之前的疑問,如果在派生類的建構函式中初始化類型別的成員物件會怎麼樣,發現這樣是不可取的,因為在類的宣告中是不可以實際分配記憶體的,但是可以宣告。
(關於son5的理解需要進一步闡明:這裡可能涉及到了c++記憶體分配,拷貝賦值的原理,如果不是很懂的話這裡我們暫且按我說的方式去理解。)
再貼一遍:
參考son1:可以驗證一開始介紹的派生類建構函式的執行順序;
參考son2:可以驗證建構函式是嚴格照上面所說的順序執行,與初始化的順序無關(儘管表面上c比a初始化的要早)。同時,如果不顯示的執行基類建構函式的初始化,就會按照順序呼叫預設的建構函式。
參考son3
:可以說明繼承下執行的建構函式與類型別的成員變數的建構函式是占用兩個不同的記憶體位址空間,二者不會相互影響。
參考son4:可以說明,無論是否顯示的初始化類型別的成員變數,都會按照成員變數在類中的宣告順序執行建構函式。
參考son5:這個解決了我之前的疑問,如果在派生類的建構函式中初始化類型別的成員物件會怎麼樣,發現這樣是不可取的,因為在類的宣告中是不可以實際分配記憶體的,但是可以宣告。
Java繼承構造執行順序
package test public class father public father package test public class son extends father public son public son int s public static void main string...
C 中多重繼承建構函式執行順序
1 1 include 2 include 3 4using namespace std 56 classa11 12 classb17 18 class c public b,publica24 25 intmain 輸出 b ac 分析 多重繼承與單繼承類似,也是先執行基類建構函式。多個基類之間...
繼承 父類子類建構函式的執行順序
當乙個類繼承了某個類時,在子類的構造方法裡,super 必須先被呼叫 如果你沒有寫,編譯器會自動呼叫super 方法,即呼叫了父類的構造方法 這並不是建立了兩個物件,其實只有乙個子類sub物件 之所以需要呼叫父類的構造方法是因為在父類中,可能存在私有屬性需要在其構造方法內初始化 package co...