c 中,類的重寫中,new和override的區別

2022-09-07 16:03:14 字數 985 閱讀 5246

在c#中有兩種方法可以重寫類的成員函式,分別是**new**和**override**,看書時書上並沒有說明兩者的區別,經過網上查資料後,總結如下:
如果使用的是override,則呼叫的是它實際類的函式,而用的是new的話,呼叫的是可以被轉換為其引用類的函式

參考**點選這裡

a類 有方法 public virtual void test() 

b類繼承自a類,有方法 public new void test()

如下例項化:

a a = new b();

a.test();

下面是override的情況:

a a = new a();

b b = new b();

a a1=new b();

a.test();//呼叫a中test();

b.test();//呼叫b中test();

a1.test();//呼叫b中test();系統會自動識別a1是b的例項

((a)b).test();//與上面相同

下面是new的情況:

a a = new a();

b b = new b();

a a1=new b();

a.test();//呼叫a中test();

b.test();//呼叫b中test();

a1.test();//呼叫a中test();

((a)b).test();//與上面相同

深究其原因,為何兩者不同,是因為原理不同。

override是覆蓋,即將基類的方法直接抹去重新寫,而new只是將基類方法隱藏起來,故而仍舊可以呼叫基類方法,當然也可用base直接訪問,但事實上即便用override的話,也能在用base直接訪問基類的方法,因為抹去,只是在派生類裡面抹去了,並沒有改變其對基類方法的訪問許可權。

c 中的new 類建構函式 new

我們都知道在例項化乙個類時會使用這個類的 init 方法,但是在真實情況中類的例項化是分成兩個階段的,第一階段是使用該類的 new 方法例項化乙個物件,第二階段才是使用物件的 init 方法進行初始化。由於很多時候,第乙個階段被我們忽略了,所以看起來例項化類時只使用了 init 方法。既然在例項化類...

C 中類的隱藏和重寫的區別

c 的類有隱藏和重寫,兩個的作用其實都是為了實現子類的更改 我是這樣認為了 但之間又有區別,隱藏的方法,只能在子類中實現,而重寫的方法是可以在父類中得以實現.可能這樣說有點玄,舉個例子就可很容易說明 類檔案中如下定義 view plaincopy to clipboardprint?public c...

關於C 中類方法的重寫和覆蓋

在c 中改變類中相同名稱的方法的實現過程中有三種方式 過載,重寫和覆蓋。首先過載是指具有相同的方法名,通過改變引數的個數或者引數型別實現同名方法的不同實現。重寫則是只在繼承中,子類通過override關鍵字修飾方法,實現父類和子類相同方法的不同實現,注意,父類方法必須是用virtual或者abstr...