下面以一下例子为例,想一下,输出的结果将会是什么:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 class A 2 { 3 public virtual void F() 4 { 5 Console.WriteLine("A.F"); 6 } 7 8 public virtual void E() 9 { 10 Console.WriteLine("A.E"); 11 } 12 } 13 14 class B : A 15 { 16 public override void F() 17 { 18 Console.WriteLine("B.F"); 19 } 20 21 public new void E() 22 { 23 Console.WriteLine("B.E"); 24 } 25 } 26 27 static void Main(string[] args) 28 { 29 B a = new B(); 30 A b = a; 31 b.F(); 32 33 b.E(); 34 a.E(); 35 Console.Read(); 36 }
你心中的答案是否正确,来看下面。
b.F();之所以调用的是B类的,是因为现在的‘F’方只有B类重写方法,被重写以后就只有这一个了。
b.E();之所以调用的是A类的,是因为NEW只起到了隐藏的作用,当A对象调用'E'方法时,肯定得先到A类去找,一找,额有,就调用此方法了,哪管派生类了。
a.E();a是属于B类对象,肯定调用B类的咯。
这是我的个人理解,如有哪说的不对,欢迎拍砖!我也是菜鸟呀!