深入繼承續 虛方法 override new

2021-06-06 05:22:22 字數 2851 閱讀 1959

virtual

關鍵字用於修飾方法、屬性、索引器或事件宣告,並且允許在派生類中重寫這些物件。例如,此方法可被任何繼承它的類重寫。

當類中的方法宣告前加上了virtual修飾符,我們稱之為虛方法,反之為非虛。    

若希望或預料到基類的這個方法在將來的派生類中會被重寫(override ),則此方法必須被宣告為 virtual。

呼叫虛方法時,將為重寫成員檢查該物件的執行時型別。將呼叫大部分派生類中的該重寫成員,如果沒有派生類重寫該成員,則它可能是原始成員。

預設情況下,方法是非虛擬的。不能重寫非虛方法。

virtual

修飾符不能與

staticabstract, private

override

修飾符一起使用。

除了宣告和呼叫語法不同外,虛擬屬性的行為與抽象方法一樣。

·        

在靜態屬性上使用

virtual

修飾符是錯誤的。

·        

通過包括使用

override

修飾符的屬性宣告,可在派生類中重寫虛擬繼承屬性。

virtual 修飾符 返回的資料型別方法名(參數列)

方法體對於非虛的方法,無論被其所在類的例項呼叫,還是被這個類的派生類的例項呼叫,方法的執行方式不變。而對於虛方法,它的執行

方式可以被派生類改變,這種改變是通過方法的過載來實現的。

override 修飾符 返回的資料型別方法名(參數列)

方法體override 重寫繼承自基類的 virtural 方法,可以理解為拆掉老房子,在原址上建新房子,老房子再也找不到了(基類方法永遠呼叫不到了)。

都可以對基類成員進行隱藏,都可以用base關鍵字呼叫基類的成員 

new和override的不同點:

用override的基類的方法必須要用virtual,而new不必要

本質區別在於當派生類物件作為基類型別使用時,override 的執行派生類方法,new 的執行基類方法。如果作為派生類型別呼叫,則都是執行 override 或 new 之後的。

override 重寫繼承自基類的 virtural 方法,可以理解為拆掉老房子,在原址上建新房子,老房子再也找不到了(基類方法永遠呼叫不到了)。

new 隱藏繼承自基類的 virtual 方法,老房子還留著,在旁邊蓋個新房,想住新房住新房(作為派生類物件呼叫),想住老房住老房(作為基類物件呼叫)。

當派生類中出現與基類同名的方法,而此方法前面未加 override 或 new 修飾符時,編譯器會報警告,但不報錯,真正執行時等同於加了 new。

下面是**實現:

public inte***ce i_9_a

string getname();

string getpwd();

}/// /// 下面這個類繼承了a介面,並實現了裡面的全部成員

///

public class i_9_l_1 : i_9_a

public int age

set

}public string getname()

public string getpwd()

}public class i_9_l_2 : i_9_l_1

public new string getpwd()

}/**當我們看了上面的演示以後會發現乙個很嚴重的問題,

* 我們明明就呼叫的2這個類,可為什麼方法卻依然是1哪個類的呢?

* 原因就在2這個類雖然是複寫了1類中的方法,但是他並沒有去改寫1類中的方法

**////

/// /// 下面這個類繼承了a介面,並實現了裡面的全部成員

///

public class i_9_l_3 : i_9_l_1

public int age

set

}public virtual string getname()

public virtual string getpwd()

}public class i_9_l_4 : i_9_l_3

public override string getname()

public override string getpwd()

}/**

* 其實這個例題理解起來不難的,首先我們知道他整個的執行順序

* 然後就是,如果發現不是虛方法,那麼就直接呼叫了,但是如果是他就會繼續往下找,一直找到不是虛的位置.

* * 我們這個例題說完了,不知道你有沒有想起我們前面說過的乙個問題,就是顯示實現的無法使用修飾符,

* 既然不能使用修飾符,那virtual也沒法用,難道顯示實現的方法就不能使用虛方法了嗎?

* * 答案是否定的,呵呵

* * 我們可以在這個顯示實現中呼叫另乙個方法嘛,哈哈,然後這個被呼叫的方法再是虛方法,我想法律不會不允許吧

* **/

////// /// 下面這個類繼承了a介面,並實現了裡面的全部成員

///

public class i_9_l_5 : i_9_a

public int age

set

}public string getname()

public string getpwd()

}public class i_9_l_6 : i_9_l_5,i_9_a

public string getname()

public string getpwd()

}}

C 深入理解 虛繼承 多重繼承和直接繼承

尊重原創 摘要 本文從5段 例項出發,通過類中類的普通繼承,類的虛繼承,類的多重繼承,多個虛函式類的普通繼承 虛繼承與多重繼承,幾個交叉概念,詳細的闡釋了繼承 虛函式與虛繼承的基本概念,深入剖析了繼承於虛繼承的區別於聯絡。exp.001 虛繼承 include class a sizeof a 4 ...

2014 03 17 繼承 介面 抽象 虛方法

物件導向程式設計的三大特性之一 繼承 c 中允許類派生新的類,而新的類繼承了基類的成員 繼承中要注意基類的訪問修飾符 public internal protected private 物件導向程式設計的的繼承性和多型性,主要是通過介面來體現的。介面 用關鍵字inte ce修飾的類,在介面中可以定義...

虛方法和重寫方法的繼承特性

這個題目起的還是有點不合適,但是當你看到下面的 就會明白我在搞些什麼名堂,其實質是辨析了一下virtual關鍵字和override關鍵字,md寫的 部分語言輸入法相容性問題,搞的我只能用用英文注釋,破鍵盤這兩也讓我敲壞了很多鍵都按下了不起作用了,無奈啊。下面我按我的理解簡單的介紹一下虛方法和重寫方法...