1樓:匿名使用者
他的子類可以重寫也可以不重寫,實現多型
c#中的虛方法究竟有什麼用了
2樓:匿名使用者
這個區別可就大了。
從類這種機制看,你覆蓋是把東西換了,對於這個類來說,以前的方法不存在了。重寫是你在這個類的虛擬函式表(不清楚自己查下)裡增加了一項,並沒有覆蓋,是一種動態性的調整。例子,類a和類b的繼承關係是類b繼承類a,然後有一個函式func。
假如func是普通函式,類b覆蓋了,那麼把一個類b的例項轉換為類a時,你呼叫這個func仍然是覆蓋後的函式,如果是虛擬函式,得到的確實類a的func。
這兩個東西或許你從感覺覺得區別不大,但是這兩個有根本性區別,虛擬函式實現了一個函式一對多的關係,可以通過同個名字但是不同地址(型別轉換,c++裡的指標等)去操作不同的函式,這種特性用覆蓋是實現不了的,因為普通函式編譯的時候已經確定了呼叫的位置,而虛擬函式的呼叫是執行時才確定的(函式地址)。
在c#中定義一個虛方法需要使用的關鍵字是?
3樓:匿名使用者
子類可以對父類中的虛方法進行重寫,虛方法是多型特性的一種體現c#中的虛方法使用virtual關鍵字定義public virtual void eat();
override關鍵字作用是對父類的virtual方法進行重寫public override void eat();
**舉例:
using system;
using system.collections;
public class animal
public virtual void eat()}public class dog:animal}public class cat:animal}public class panda:
animal}public class mainfun}
4樓:幻雪靈烽
class test
在實現初過載就可以了
public new void testshow()
c#中,虛方法的特點是什麼?
5樓:仙戈雅
從oop思想出發:虛方法是允許派生類(即其子類)對父類進行擴充套件.比如原父類的某個虛方法不能滿足你的需求時,那麼此時可以對它進行擴充套件(也稱為重寫)。
c#虛方法和非虛方法的區別
6樓:匿名使用者
結果:a.f b.f b.g b.g
虛方法允許子類重寫,非虛方法就不是重寫了,需要定義一個new來告訴編譯器我新定義了一個f方法。
a a = b;=> a a = b as a;
a.f()呼叫a的f b.f()調b的f;
a.g()和b.g()因為呼叫的為虛方法,執行時會判斷b有無重寫g 方法,重寫調b.g,沒重寫a,g
7樓:匿名使用者
虛方法需要加一個標識來重寫.
非虛方法需要加new來標識為覆蓋
8樓:
b繼承自a,所以可以用b來定義a。這個例子就是告訴你例項物件的方法是怎麼執行的。你寫的ffgg不完整,難怪你沒看懂。
a.f還是b.f是很關鍵的,這裡說明執行的是父類同名方法還是子類方法。
在c#中的虛方法,以下說法正確的是()
9樓:顧影自憐
bca是靜態方法
d使用了virtul後不能再使用static、abstract或override修飾符。
c 中的虛擬函式有什麼作用,C 中虛擬函式的作用是什麼?它應該怎麼用呢?
類的三個重要特徵 封裝 繼承 多型性。其中多型性就是通過函式過載 運算子過載實質上也是函式過載 和虛擬函式來實現的。虛擬函式的作用 在基類用virtual宣告成員函式為虛擬函式,在派生類中重新定義該函式,就可以通過基類指標或引用來訪問基類和派生類中的同名函式。虛擬函式實現多型性 同一類族中不同類的物...
C 中,虛基類是如何避免兩義性的
c 的繼承中的基類就是派生類的一個子物件,也就是說基類是派生類的一個子部分,它佔用派生類的一部分記憶體。當b類從a類派生時,b類物件中就會有sizeof a 大小的儲存空間用於儲存a類子物件。當通過b類物件來訪問a類的成員時,產生的訪問指令使用的地址是b物件的起始地址 a物件在b物件的偏移量 a成員...
死神中的虛,求死神裡虛的等級劃分 ! 詳解
虛是由迷戀人間的失去 胸口鎖鏈 也就是心 的靈變成 但偶有列外,類如普通靈魂被虛同化等 首先虛的演變是從身體開始,當他成型時,會長出面具 行為上已經不完全受原主意識的控制,攻擊意識會被放大。並且為了填補自己內的空缺感,會去捕食自己最愛的人。當他完成這一階段後,就會變成無感情的真正的虛。能力由原主的內...