壹. 相同
他們有些相似。有些場景用哪個都行!
1. 修飾父類、讓子類重寫
virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。
2. 都用必須public
如果用來修飾方法,前面必須新增public,要不然就會出現編譯錯誤:虛擬方法或抽象方法是不能私有的。畢竟加上virtual或abstract 就是讓子類重新定義的,而private成員是不能被子類訪問的。
貳. 區別
但是它們的區別很大。(virtual是「虛擬的」,abstract是「抽象的")。
1. 必須實現、必須沒有實現
指父類中
virtual修飾的方法必須有實現(哪怕是僅僅新增一對大括號),而abstract修飾的方法一定不能實現。如對於virtual修飾的方法如果沒有實現則會報錯。
2.可以重寫、必須重寫
virtual可以被子類重寫,而abstract必須被子類重寫,
3.必須在抽象類
如果類成員被abstract修飾,則該類前必須新增abstract,因為只有抽象類才可以有抽象方法。
4.無法例項化
無法建立abstract類的例項,只能被繼承無法例項化,強行new出來 將出現編譯錯誤:抽象類或介面不能建立例項。
補充:
c#中如果要在子類中重寫方法,必須在父類方法前加virtual,在子類方法前新增override,這樣就避免了程式設計師在子類中不小心重寫了父類方法。
我也說說virtual 和非 virtual
virtual和非virtual關鍵是在執行時候,而不是在編譯時候.1.如果非virtual,編譯器就使用宣告的類對應的型別,也就是說,不是virtual的,在編譯時候,就定了,比如例子 執行結果 father,son,girl,都是執行的父類的方法 2,如果方法是virtual的,然後子類使用了o...
abstract和virtual方法實現多型的區別
多型就是不同物件對同乙個訊息的不同相應方式。舉例 cut 訊息 醫生收到cut訊息後,執行動手術 理髮師收到cut訊息後,執行減法 演員收到cut訊息後,停止演出。三個不同物件,對同乙個cut訊息的反應都不同,這就是多型。在c 中abstract和virtual方法都能實現多型。1.用abstrac...
abstract和virtual方法實現多型的區別
多型就是不同物件對同乙個訊息的不同相應方式。舉例 cut 訊息 醫生收到cut訊息後,執行動手術 理髮師收到cut訊息後,執行減法 演員收到cut訊息後,停止演出。三個不同物件,對同乙個cut訊息的反應都不同,這就是多型。在c 中abstract和virtual方法都能實現多型。1.用abstrac...