c# 中基類變量指向派生類對象的實例化

這一篇文章轉載自:http://www.xuebuyuan.com/390279.htmlhtml

我對這篇文章進行了一一的驗證,確實是這樣子的,也明白了不少東西,以爲頗有用,轉載過來但願可以幫助你們。函數

1.      層次結構(針對構造函數)

要實例化的類的構造函數自己不能初始化類,還必須調用基類中的構造函數。因此引入層次結構進行構造。工具

層次結構的構造是:先找到要實例化的類的構造函數,再找到並默認他父類的構造函數,再往上找到system.object基類的構造函數,當上面再也沒有類時。從這個頂層的類開始下發構造函數的執行。spa

2. 對象初始化順序orm

  子類的屬性或字段----->基類的屬性或字段----->基類的構造函數----->子類的構造函數htm

a)     先變量後構造函數。變量先被初始化,而後構造函數被執行對象

b)     先靜態化後實例化。當一個類被訪問時,靜態變量和構造函數最早被初始化.接着是對象的實例化變量和構造函數被初始化ip

c)      先派生類後基類。對於變量和靜態構造函數,派生對象在基對象以前被初始化.好比C類派生自B類,B類派生自A類,那麼變量和靜態構造函數被初始化次序是C-B-A.get

d)     除了實例構造函數。對於實例構造函數,基類構造函數在派生類構造函數以前執行,實例構造函數被執行次序是A-B-C.it

e)     不要假定變量的次序。Fields依據它們在源文件中的聲明的順序依次初始化.然而,自從程序員和工具能夠隨意安排變量的聲明後,你不該該在依靠變量任何特別的次序初始化

f)      對虛方法用兩個階段的構建。避免從一個構造器調用虛方法. 若是在初始化一個對象時須要調用一些虛方法,應在完整構造該對象的地方使用兩階段的構建,並隨後調用已構造對象的初始化方法

3.     root = new Child(); 這個方法實際上是面向對象方面的知識。

基類的對象固然不能訪問派生類的成員了,雖然其實是個child對象,但其類型是parent,向上轉換後,已經屏蔽了對派生類成員的訪問

root這個對象,會忽略child類的其餘派生方法,只有重寫方法受到影響。

相關文章
相關標籤/搜索