C virtual和abstract的區別

2022-02-21 04:25:22 字數 1229 閱讀 1598

虛方法和抽象方法都可以供派生類重寫,它們之間有什麼區別呢?

1. 虛方法必須有實現部分,抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被例項化。如:

//抽象方法

public abstract class animal

public abstract void sleep();

public abstract void eat();

//虛方法

public class animal

public virtual void sleep(){}

public virtual void eat(){}

2. 抽象方法只能在抽象類中宣告,虛方法不是。其實如果類包含抽象方法,那麼該類也是抽象的,也必須宣告為抽象的。如:

public class animal

public abstract void sleep();

public abstract void eat();

編譯器會報錯:

main.cs(10): 'vstest.animal.sleep()' is abstract but it is contained in nonabstract class 'vstest.animal'

main.cs(11): 'vstest.animal.eat()' is abstract but it is contained in nonabstract class 'vstest.animal'

3. 抽象方法必須在派生類中重寫,這一點跟介面類似,虛方法不必。如:

public abstract class animal

public abstract void sleep();

public abstract void eat();

public class cat : animal

public override void sleep()

console.writeline( "cat is sleeping

" );

// we need implement animal.eat() here

編譯器會報錯:main.cs(14): 'vstest.cat' does not implement inherited abstract member 'vstest.animal.eat()',因為我們沒有實現抽象類中所有抽象方法。

4.虛函式可以實現多型,而抽象函式不行。

函式=方法

C virtual和abstract的區別

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

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 ...