C virtual和abstract的區別

2021-06-22 10:32:42 字數 1619 閱讀 8960



virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。

它們有乙個共同點:如果用來修飾方法,前面必須新增public,要不然就會出現編譯錯誤:虛擬方法或抽象方法是不能私有的。畢竟加上virtual或abstract就是讓子類重新定義的,而private成員是不能被子類訪問的。

但是它們的區別很大。(virtual是「虛擬的」,abstract是「抽象的").

(1)virtual修飾的方法必須有實現(哪怕是僅僅新增一對大括號),而abstract修飾的方法一定不能實現。如對於virtual修飾的方法如果沒有實現:

public

class

test1

錯誤    2    「test1.fun1()」必須宣告主體,因為它未標記為 abstract、extern 或 partial   

對於abstract修飾的方法如果有實現:

public

abstract

class

test2

}

錯誤    1    「test2.fun2()」無法宣告主體,因為它標記為 abstract   

(2)virtual可以被子類重寫,而abstract必須被子類重寫,

class

basetest1

//必須有實現

}

class

derivetest1:basetest1

}

編譯不會出現錯誤,如果重寫了virtual修飾的方法,前面必須新增override(這樣就告訴了編譯器你要重寫虛擬方法),而且必須有實現,否則編譯出錯;

abstract

class

basetest2

class

derivetest2 : basetest2

錯誤2:重寫時沒有新增override

//override void fun() 錯誤3:虛擬成員或者抽象成員不能是私有的(只要在父

類中宣告了虛擬成員或抽象成員,即便是繼承的也要加上這個限制)

public

override

void fun() //

如果重寫方法; 錯誤:「a.derivetest2」不實現

繼承的抽象成員「a.basetest2.fun()」

}

(3)如果類成員被abstract修飾,則該類前必須新增abstract,因為只有抽象類才可以有抽象方法。

(4)無法建立abstract類的例項,只能被繼承無法例項化,比如:     basetest2 base2 = new basetest2();將出現編譯錯誤:抽象類或介面不能建立例項。

(5)c#中如果要在子類中重寫方法,必須在父類方法前加virtual,在子類方法前新增override,這樣就避免了程式設計師在子類中不小心重寫了父類方法。

(6)abstract方法必須重寫,virtual方法必須有實現(即便它是在abstract類中定義的方法).

abstract

public

class

test

}public

class

class1 : test

*/}

C virtual和abstract的區別

虛方法和抽象方法都可以供派生類重寫,它們之間有什麼區別呢?1.虛方法必須有實現部分,抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被例項化。如 抽象方法 public abstract class animal public abstract void sleep p...

C Virtual和Override的幾種組合

情況 class a public void show class b a public void show 編譯通過,有警告讓在b的方法裡新增new關鍵字,以便將a的方法隱藏 編譯時繫結 根據宣告型別呼叫方法 情況2 class a public virtual void show class b...

C virtual函式重點

虛函式是c 中用於實現多型 polymorphism 的機制。核心理念就是通過基類訪問派生類定義的函式,虛函式只能借助於指標或者引用來達到多型的效果。虛函式的語法 1 class a class b public a class c public b 從b繼承,不是從a繼承!這種情況下,b foo ...