1,首先这个问题是建立在父类对象指向子类类型的,先不多说了,先上代码
代码一:输出结果为 A、B、A.fun

1 using System; 2 3 namespace ConsoleApplication1 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 A a = new B(); 10 a.fun(); 11 } 12 } 13 14 public class A 15 { 16 public A() 17 { 18 Console.WriteLine("A"); 19 } 20 21 public virtual void fun() 22 { 23 Console.WriteLine("A.fun"); 24 } 25 } 26 27 public class B:A 28 { 29 public B() 30 { 31 Console.WriteLine("B"); 32 } 33 34 new public void fun() 35 { 36 Console.WriteLine("B.fun"); 37 } 38 } 39 }
代码二:输出结果为:A、B、B.fun

1 using System; 2 3 namespace ConsoleApplication1 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 A a = new B(); 10 a.fun(); 11 } 12 } 13 14 public class A 15 { 16 public A() 17 { 18 Console.WriteLine("A"); 19 } 20 21 public virtual void fun() 22 { 23 Console.WriteLine("A.fun"); 24 } 25 } 26 27 public class B:A 28 { 29 public B() 30 { 31 Console.WriteLine("B"); 32 } 33 34 public override void fun() 35 { 36 Console.WriteLine("B.fun"); 37 } 38 } 39 }
代码一与代码二的主要区别就是在class B中对方法fun()的修士符,代码一是new 代码二是override吗,而两者的结果却截然不同,后来想了想,明白了
2.new Method实际上是新写了一个函数,基类里的仍然存在,当基类对象调用方法的是还是调用基类里面的方法;
而override是重写了基类里的函数,一旦子类被被执行过,那么基类里的这个方法就被彻底隐藏了,指向子类的对象就会执行子类里面的方法。