整理了下c#中基類以及派生類的建構函式,變數宣告的執行順序。
先上試驗**:
1class
program212
}13//基類
14classa15
28//
建構函式
29public
a()30
34//
虛方法35
public
virtual
void
m()3639}
4041
//派生類
42class
b : a
4354
//建構函式
55public
b()56
: base
()57
62//
重寫方法
63public
override
void
m()6468}
69classc70
**中使用了另乙個類的靜態int型變數記錄下各個部分的執行順序。
執行結果是:
it is in static b()_02
it is in static a()_05
it is in a()_07
it is in b.m()_08
b.g_a=a.g_a_06_09
it is in b()_10
it is in b.m()_12
b.g_a=a.g_a_06->b.g_a_11_13
a.s_a_04
b.s_b_01
a.g_a_06->b.g_a_11
a.g_a_1_06
b.g_b_03
整理下後得到:
b.s_b_01
it is in static b()_02
b.g_b_03
a.s_a_04
it is in static a()_05
a.g_a_1_06
it is in a()_07
it is in b.m()_08
b.g_a=a.g_a_06_09
it is in b()_10
a.g_a_06->b.g_a_11
it is in b.m()_12
b.g_a=a.g_a_06->b.g_a_11_13
結論:當例項化乙個子類時,父類以及子類的變數和建構函式的執行順序如下:
01子類的靜態變數->02子類的靜態建構函式->03子類的變數->04父類的靜態變數(此時因為要執行子類的建構函式,會與父類發生關係)
->05父類靜態建構函式->06父類變數->07父類建構函式->10子類建構函式->結束
在試驗過程裡面新增了幾個步驟主要說明子類重寫父類方法的呼叫情況:
1)在父類的建構函式中呼叫(步驟08),此時呼叫子類的實現時,其中的變數g_a的值還是來自於父類(步驟09)。
2)在呼叫子類的建構函式後,變數g_a的值被重新設定(步驟11),此時呼叫子類的實現時,變數值是子類建構函式中設定的。
C 基類和派生類的建構函式
前面我們說基類的成員函式可以被繼承,可以通過派生類的物件訪問,但這僅僅指的是普通的成員函式,類的建構函式不能被繼承。建構函式不能被繼承是有道理的,因為即使繼承了,它的名字和派生類的名字也不一樣,不能成為派生類的建構函式,當然更不能成為普通的成員函式。在設計派生類時,對繼承過來的成員變數的初始化工作也...
C 基類和派生類的建構函式(詳解)
基類的成員函式可以被繼承,可以通過派生類的物件訪問,但這僅僅指的是普通的成員函式,類的建構函式不能被繼承。建構函式不能被繼承是有道理的,因為即使繼承了,它的名字和派生類的名字也不一樣,不能成為派生類的建構函式,當然更不能成為普通的成員函式。在設計派生類時,對繼承過來的成員變數的初始化工作也要由派生類...
基類與派生類的建構函式
一 預設建構函式的呼叫關係 通過下面的例子,我們來看一下基類與派生的建構函式的呼叫順序。建立時先基類後派生類。銷毀時先派生類後基類。include include using namespace std class cbase cbase class cderive public cbase cde...