3

为什么闲置代码的结果是:

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();
}
4

2 回答 2

10

这是因为virtual不等于override。通过使用virtual关键字,您实际上创建了新方法,该方法是虚拟的,但对于您的类(B 类)来说是新的,并且不会覆盖类的 A 方法。从 B 继承的 C 类不知道类的 A 方法 f(),因此需要 Bf() 来覆盖它。在 Main 方法中,您正在创建一个 A 类数组,其中仅存在 Af() 方法。如果你想

Class A  
Class B  
Class C

输出使用override而不是virtual在 B 类中。

于 2012-06-18T07:17:26.150 回答
0

AAA 因为

A[] array = new A[3]; /*main reference to A object*/
于 2012-06-18T10:38:47.697 回答