为什么不能在C#中使用重写方法? (不是关键字)

public abstract class A { public void CallMe() { Console.WriteLine("I am A."); } } public class B : A { new public void CallMe() { Console.WriteLine("I am B."); } } class Program { static void Main(string[] args) { A a = new B(); a.CallMe(); } } 

输出是“我是A.”

为什么会这样? 这合理吗?

由Visual Studio 2012编译。

您需要在基类中创建CallMe()方法virtual ,然后在B使用override修饰符:

 public abstract class A { public virtual void CallMe() { Console.WriteLine("I am A."); } } public class B : A { public override void CallMe() { Console.WriteLine("I am B."); } } 

B.CallMe()不会覆盖A.CallMe() ,它会A.CallMe()或隐藏A.CallMe() 。 由于CallMe是非虚方法,因此编译器根据变量的编译时类型选择调用哪个方法。 由于a的编译时类型是class A因此它将调用A.CallMe()

如果你想让它调用B.CallMe()你需要在A.CallMe()上使用virtual关键字,它将启用虚拟调度,应用程序将根据class B的运行时类型调用CallMe()方法。

请参阅隐藏inheritance