C 中A a new B 的意義

2021-09-07 08:34:59 字數 2946 閱讀 1249

a a=new b()的意義

前提:a是b的父類。

a a = new b();

或a a;

b b=new b();

a=b;

這一句的過程是這樣的,

1)建立乙個類a的引用a

2)建立乙個類b的例項

3)把類b的引用賦值給a

因為a是b的父類,所以,賦值成功。

過程:當訊息傳送到子類並要求以確定的引數呼叫其中乙個方法時:

訊息的處理如下沿著類鏈自下而上逐級查詢,直到找到符合訊息所要求的方法為止。

子類檢查是否有同名且引數完全對應(引數的個數、型別、排列順序均要相同)的方法,

若有,就呼叫它,

若沒有,

它的父類就響應這個訊息的處理,

查詢同名及同引數個數、型別、順序的方法,

若有,就呼叫這個方法。

如果查詢到最上層仍未找到就會產生"編譯出錯"。

子類中若有與其祖先類同名的並具有相同參數列的方法時,

則具有遮蔽或隱藏其祖先類同名方法的功能。

b繼承a a a=new b();b a=new b()區別

public abstract class a

public virtual void fun()

}public class b : a

public new void fun()

public static void main()

}他的輸出時 a b a.fun()

a a=new b();

這裡a編譯時型別是a,執行型別是b". 所以建構函式的呼叫就清晰明了吧

然而還是有點奇怪,如果a執行時型別是b的話,那麼在呼叫方法f()時,為什麼不呼叫b的方法f()(而是呼叫 a 的方法f())呢?

這是因為父類引用指向子類的物件(例項)

這時候 會呼叫子類重寫的方法 但是不能呼叫父類沒有的但是子類有的方法

再有就是override與new得區別

如過程式裡面的new換成override輸出時是什麼樣子呢?

將會是 a b b.fun();這是為什麼呢

override的「覆蓋」也就是次數重寫是指子類覆蓋了父類思路方法子類物件無法再訪問父類中該思路方法

new是指「隱藏」是指子類隱藏了父類思路方法當然通過定轉換可以在子類物件中訪問父類思路方法

new 修飾符

使用 new 修飾符顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中宣告該成員,並用 new 修飾符修飾它

1.b繼承a,請問a是a的例項還是b的例項啊?

答:b的例項

2.物件a可以呼叫a類中的方法嗎?可以呼叫b的方法嗎?

答:不一定,如果是虛擬方法,並且在b類過載了a的虛擬方法,a將會呼叫b的同名方法,普通方法會呼叫a的方法,

舉例:class a

public virtual void methodb()

}class b:a

public override void methodb()

}其中,b類重寫了a類的普通方法methoda,也重寫了a類的虛擬方法methodb,則:

a a = new b();

a.methoda();// 將會呼叫a類的methoda方法

a.methodb();// 將會呼叫b類的methodb方

b是a的子類,用a a=new b(),這樣定義乙個"a", 只能使用b中繼承a中的方法或變數,而在b中新增的方法或者變數,"a"不能引用。(也就是 a只能使用b複寫a中的方法或

者變數)

專業一點說是:a是a的引用,並建立了b的物件。

簡單一點說:a是a的型別,但卻擁有了b的功能。

你錯在這句話 "而在b中新增的方法或者變數,"a"不能引用"

c#多型性的體現:過載,覆蓋,隱藏2009-04-07 14:401.多型的理解

多型性的含義:使得能夠利用基類的指標來引用不同子類的物件,以及根據所引用物件的不同,以不同的方式執行相同的操作。

多型的作用:把不同的子類物件都當作父類來看,可以遮蔽不同子類物件之間的差異,寫出通用的**,做出通用的程式設計,以適應需求的不斷變化。

多型分為編譯期繫結和執行期繫結。

2.過載,覆蓋,隱藏

using system;

using system.collections.generic;

using system.text;

class a

public virtual void g()

}class b : a

//過載

public void f(string str)

//覆蓋

public override void g()}}

}過載(overload)用於同一類中的成員函式,其特徵為:

* 1)在同一類中

* 2)相同的函式名

* 3)引數不同(包括引數型別不同,或引數個數不同,或兩者都不同,注意:和返回值沒關係)

* 4)和是否虛函式無關

覆蓋(override)是指派生類函式覆蓋基類函式,其特徵為:

* 1)不同的範圍(分別位於派生類與基類)

* 2)相同的函式名稱

* 3)引數相同

* 4)基類函式必須是虛函式

用法:基類中用virtual修飾符,子類中用override修飾符,重寫後,子類物件和基類物件訪問該方法時,結果都是在訪問子類中重新定義的方法。

隱藏(hide)是指派生類的函式遮蔽了與其同名的基類函式,其特徵為:

* 1)不同的範圍(分別位於派生類與基類)

* 2)相同的函式名

* 3)若引數不同,不管基類函式有無virtual關鍵字,基類函式將會被隱藏。

若引數相同,基類函式無virtual關鍵字。基類函式將會被隱藏。

注意:用法:基類函式virtual修飾符可有可無,子類函式可用new標識隱藏該方法,最後通過基類的引用訪問該方法時,訪問的仍是基類的函式,子類物件訪問的是子類的函式。

C程式中的 line意義何在

在學習一些專案源 時,看到了大量的 line定義,小人不才,語法搜搜是大概懂了,可問個為什麼,卻難道了自己。line是c語言預處理器,語法格式為 line number filename 如 line 123 file.c 意思就是改變 line 和 file 巨集內容。當在程式中使用這兩個巨集的時...

了解C 中typename的雙重意義

typename的最多用法就是模板宣告中,以下兩種宣告沒有任何區別。template t class test template t class test typename的另乙個作用就是使用巢狀依賴型別 nested depended name include include using name...

C 中多型的概念和意義

1 函式重寫回顧 示例 child c parent p c c.parent print 從父類中繼承 i m parent.c.print 在子類中重寫 i m child.p print 父類中定義 i m parent.不是我們期望的版本,因為 p 指向了子類物件,期望呼叫子類版本 2 面相...