class A
{
public string Str = "A";
public void Show() { Console.WriteLine("Show A"); }
}
class B : A
{
public string Str = "B";
public virtual void Show() { Console.WriteLine("Show B"); }
}
class C : B
{
public override void Show() { Console.WriteLine("Show C"); }
}
class Program
{
static void Main(string[] args)
{
A a=new C();
a.show();
Console.ReadLine();
}
}
//////////得出的结果怎么是
Show A?????
------解决思路----------------------
A.Show没有标记为virtual,编译器会认为A.Show和B.Show除了名称和参数相同以外没有什么关系,所以A和B不存在重载的情况。那么到底是调用了哪个Show方法,还是要看类型申明成了什么,你的代码里声明成了A,尽管是实例化成了C,但还是调用了A的Show方法。
------解决思路----------------------
对于现在你来说可能只是知道这个修饰是什么,但是还没理解(而且overrd还不是重载,重载和重写不同)。
对于虚方法,如果子类没有重写,就默认使用基类的方法,如果重写就是用子类方法。
至于你属的new和这个没关系。基类不是虚方法的也可以new,不过new的概念和你这个例子没什么关系了。
------解决思路----------------------
然我们来看看写 class B 的这位同学的心里活动:”首先,我先看看class A有没有什么定义为public的但是没有写virtual的方法,找到了!是Show方法,它是public的(暴露接口方法、将来被人在多态应用中会被调用)并且没有 virtual。然后,呵呵,突出我会c#编程语法的机会到了,我故意弄一个同名的Show方法并且写上virtual,将来遇到 lz 这类多态运行时错误时,我就在同学们和老师面前成功地成为麻烦焦点而又能狡辩一堆c#语法了”。
这在我的开发工程过程中是禁止的。因为这种程序设计思路是糟粕。