当方法被定义为virtual时,表明方法为虚方法。
虚方法的作用:提供子类重写(override)父类方法的权利。(java中所有方法默认为虚方法)
一个子类如果想改变父类中的非虚方法功能,可以使用new关键字隐藏父类方法。
声明类与实例类不同时(声明类是实例类父类)。
首先在声明类中查找当前方法,如果没找到,再到声明类的父类中去找直到找到为止。
找到后检查该方法是否为虚方法,如果为非虚方法立即调用。如果为虚方法,从实例类中开始找,找不到再在其父类中找,直到找到为止,找到后立即执行。
例:
1 public class A 2 { 3 public string GetUnvirtual() 4 { 5 return "A.Unvirtual"; 6 } 7 public virtual string GetVirtual() 8 { 9 return "A.Virtual"; 10 } 11 } 12 13 public class B : A 14 { 15 new public string GetUnvirtual() 16 { 17 return "B.Unvirtual"; 18 } 19 public override string GetVirtual() 20 { 21 return "B.Virtual"; 22 } 23 } 24 25 public class C : B 26 { 27 new public string GetUnvirtual() 28 { 29 return "C.Unvirtual"; 30 } 31 public override string GetVirtual() 32 { 33 //return base.GetVirtual(); 34 return "C.Virtual"; 35 } 36 }
C c = new C();
A a = c;
a.GetUnvirtual(); 返回 "A.Unvirtual"
a.Getvirtual(); 返回 "C.Virtual"