前言
1、派生類自動包含基程式設計客棧類的所有成員。但對於基類的私有成員,派生類雖然繼承了,但是不能在派生類中訪問。
2、所有的類都是按照繼承鏈從頂層基類開始向下順序構造。最頂層的基類是system.object類,所有的類都隱式派生於它。只要記住這條規則,就能理解派生類在例項化時對建構函式的呼叫過程。
不知道大家在使用繼承的過程中有木有遇到過呼叫建構函式時沒有按照我們預期的那樣執行呢?一般情況下,出現這樣的問題往往是因為類繼承結構中的某個基類沒有被正確例項化,或者沒有正確給基類建構函式提供資訊,如果理解在物件生命週期的這個階段發生的事情,將更利於解決此類問題。
為了例項化派生的類,必須先例項化它的基類。而要例項化這個基類。又必須要例項化這個基類的基類,這樣一直到例項化system.object(所有類的跟)為止,結果無論使用什麼建構函式例項化乙個類,總是首先呼叫system.object.object().
下面乙個示例演示執行順序:
基類:public class mybaseclass
public mybaseclass(int i)
}派生類:
public myderivedclass()
public myderivedclass(int i)
public myderivedclass(int i,int j)
接下來我們在main函式中以不帶引數的建構函式例項化myderivedclass:
myderivedclass myobj = new myderivedclass();
執行程式,控制台輸出如下:
從結果可以看出,執行順序先是基類構造的函式,接下來才是派生類的建構函式,即
1.執行system.object.object()建構函式(object比較特殊,所有類的基類,一般可以不考慮,但是得知道它也是被執行了的)
2.執行mybaseclass.mybaseclass()建構函式
3.執行myderivedclass.myderivedclass()建構函式
如果我們以帶乙個引數的建構函式例項化myderivedclass:
myderivedclass myobj = new myderivedclass(4);
執行程式,控制台輸出如下:
可以看出執行順序如下:
1.執行system.object.object()建構函式
2.執行mybaseclass.mybaseclass()建構函式
3.執行my程式設計客棧derivedclass.myderivedclass(int i)建構函式
同理如果我們以帶兩個引數的建構函式例項化myderivedclass
myderivedclass myobj = new myderivedclass(4,8);
執行程式,控制台輸出如下:
可以看出執行順序如下:
1.執行system.object.object()建構函式
2.執行mybaseclass.mybaseclass()建構函式
3.執行myderivedclass.myderivedclass(int i,int j)建構函式
大多數情況下這個都能正常工作,但是有時我們需要對發生的事件進行更多的控制。比如我們想得到如下所示的執行順序:
1.執行system.object.object()建構函式
2.執行mybaseclass.mybaseclass(int i)建構函式
3.執行myderivedclass.myderivedclass(int i,int j)建構函式
使用這個順序,可以把使用int i引數的**放到mybaseclass(int i)中,myderivedclass(int i,int j)只需要處理int j(假設int i引數在mybaseclass和 myderivedclass裡含義是一樣的)
為此,只需要使用www.cppcns.com建構函式初始化器,把**放到方法定義的冒號後面,如在派生類的建構函式中指定所使用的基類的建構函式,如下所示:
public myderivedclass(int i,int j) : base(i)
其中,base關鍵字指定在例項化過程中使用具有指定引數的建構函式。這裡使用了int引數,其值通過i傳遞給myderivedclass建構函式,所以將使用mybaseclass(int i),這樣就不會呼叫mybaseclass()了,我們重新執行下前面兩個引數的例項化**,就可以看出執行結果確實如此:
除了base關鍵字,還可以使用this關鍵字用作建構函式初始化器,這個關鍵字指定在呼叫指定的建構函式前,例項化過程對當前類使用非預設的建構函式。例如:
public myderivedclass():this(5,6)
使用myderivedcalss()建構函式例項化,執行順序是:
1.執行system.object.object()建構函式
2.執行mybaseclass.mybaseclass(int i)建構函式
3.執行myderivedclass.myderivedclass(int i,int j)建構函式
4.執行myderivedclass.myderivedclass()建構函式
總之呢,無論派生類上使用什麼樣的建構函式(預設的or不是預設的),除非明確指定(如使用base關鍵字),否則就先呼叫用基類的預設建構函式。
總結本文標題: c#類繼承中建構函式的執行序列示例詳解
本文位址: /ruanjian/csharp/239757.html
C 中類中建構函式的執行序列
所有的類都至少包含乙個建構函式。這些建構函式中可能有乙個預設的建構函式,預設的建構函式沒有引數,與類同名。其它帶引數的建構函式稱為非預設的建構函式。在類的外部不能用私有的建構函式例項化物件,通過把預設的建構函式設定為私有,就可以強制類的使用者使用非預設的建構函式。一些類沒有公共的建構函式,外部 就不...
C 類的繼承中,建構函式的執行順序
先看下邊的程式 class a public a string a public virtual void printfields class b a public override void printfields y x,y 如果執行 b b new b a 會輸出x 1,y 0.因為在例項化子...
C 中多重繼承建構函式執行順序
1 1 include 2 include 3 4using namespace std 56 classa11 12 classb17 18 class c public b,publica24 25 intmain 輸出 b ac 分析 多重繼承與單繼承類似,也是先執行基類建構函式。多個基類之間...