2012-06-18 49 views
3

爲什麼休耕代碼的結果是:C#類多態性

A類
A類
A類

public class A { 
    public virtual void f() { 
     Console.WriteLine("Class A"); 
    } 
} 
public class B : A { 
    public virtual void f() { 
     Console.WriteLine("Class B"); 
    } 
} 
public class C : B { 
    public override void f() { 
     Console.WriteLine("Class C"); 
    } 
} 
//... 
static void Main(string[] args) { 
    A[] array = new A[3]; 
    array[0] = new A(); 
    array[1] = new B(); 
    array[2] = new C(); 
    for(int d = 0; d < 3; d++) 
     array[d].f(); 
} 
+1

如果這是一門功課的問題把「功課」的標籤,請 –

+0

結果ISN」 t'AAA',其「A類A類A類」。 – Reniuz

+0

這不是一項家庭作業,我讀了一本書,我不明白爲什麼這樣的結果。 – Mark

回答

10

這是因爲virtual不等於override。通過使用virtual關鍵字,你基本上可以創建新的方法,它是虛擬的,但對你的類(類B)是新的,並且不會覆蓋類的A方法。從B繼承的類C不知道類的A方法f(),所以它需要B.f()來覆蓋它。在Main方法中,您正在創建一個只有A.f()方法存在的A類數組。 如果你想在B類

Class A 
Class B 
Class C 

輸出使用override代替virtual

+1

我想他在問爲什麼他把A A作爲輸出。 –

+1

你是對的,解決了這個問題 – Blablablaster

0

AAA因爲

A[] array = new A[3]; /*main reference to A object*/