虛方法和抽象方法都可以供派生類重寫,它們之間有什麼區別呢?
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 ...