2016-01-23 34 views
2

我期望输出C在这个程序中。但实际结果是A
请解释为什么程序打印AC#中的多态性。解释输出

class A 
{ 
    public virtual void say() 
    { 
     Console.WriteLine ("A"); 
    } 
} 

class B : A 
{ 
    public new virtual void say() 
    { 
     Console.WriteLine ("B"); 
    } 
} 

class C : B 
{ 
    public override void say() 
    { 
     Console.WriteLine ("C"); 
    } 
} 

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     A a = new C(); 
     a.say(); 
    } 
} 

回答

3

这是因为您在类B中创建了new虚拟方法say()
这种新方法隐藏了原始方法A.say(),所以在类C中,您重写了此新方法B.say()而不是A.say()

既然你宣布你的对象为A

A a = new C(); 

A.say()方法被调用。