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编译。
答案 0 :(得分:0)
您需要在基类CallMe()
中设置virtual
方法,然后使用override
中的B
修饰符:
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."); }
}
答案 1 :(得分:0)
B.CallMe()
不会覆盖A.CallMe()
,它会隐藏或隐藏A.CallMe()
。由于CallMe
是非虚方法,因此编译器根据a
变量的编译时类型选择调用哪个方法。由于a
的编译时类型为class A
,因此会调用A.CallMe()
。
如果您希望它呼叫B.CallMe()
,您需要使用virtual
上的A.CallMe()
关键字,这将启用虚拟调度,应用程序将基于此调用CallMe()
方法运行时类型a
,即class B
。