虽然B里有实现Sum()

时间:2022-01-17 05:15:45

若一个实例要领声明前带有virtual关键字,那么这个要领就是虚要领。
虚要领与非虚要领的最大差别是,,虚要领的实现可以由派生类所代替,这种代替是通过要领的重写实现的(以后再讲)
虚要领的特点:
虚要领前不允许有static,abstract,或override修饰符
虚要领不能是私有的,因此不能使用private修饰符
虚要领的执行:
我们知道一般函数在编译时就静态地编译到了执行文件中,其相对地点在措施运行期间是不产生变革的,
而虚函数在编译期间是不被静态编译的,它的相对地点是不确定的,它会按照运行时期东西实例来动态判断要挪用的函数,
此中阿谁申明时界说的类叫申明类,阿谁执行时实例化的类叫实例类。
如:A a =new B(); 此中A是申明类,B是实例类。
1.当挪用一个东西的函数时,系统会直接去查抄这个东西申明界说的类,即申明类,看所挪用的函数是否为虚函数;
2.如果不是虚函数,那么它就直接执行该函数。而如果是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是开始查抄东西的实例类。
3.在这个实例类里,他会查抄这个实例类的界说中是否有实现该虚函数或者从头实现该虚函数(通过override关键字)的要领,
如果有,它就不会再找了,而是顿时执行该实例类中实现的虚函数的要领。而如果没有的话,系统就会不竭地往上找实例类的父类,
并对父类反复适才在实例类里的查抄,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。
例1:

class A { public virtual void Sum() { Console.WriteLine("I am A Class,I am virtual sum()."); } } class Program { static void Main(string[] args) { A a=new A(); // 界说一个a这个A类的东西.这个A就是a的申明类,实例化a东西,A是a的实例类   a.Sum(); Console.Read(); } }

执行a.Sum:
1.先查抄申明类A 2.查抄到是sum是虚拟要领 3.转去查抄实例类A,功效是题自己 
4.执行实例类A中实现Sum的要领 5.输出功效 I am A Class,I am virtual sum(). 
例2:

class A { public virtual void Sum() { Console.WriteLine("I am A Class,I am virtual sum()."); } } class B : A { public override void Sum() // 从头实现了虚函数 { Console.WriteLine("I am B Class,I am override sum()."); } } class Program { static void Main(string[] args) { A a=new B(); // 界说一个a这个A类的东西.这个A就是a的申明类,实例化a东西,B是a的实例类   a.Sum(); Console.Read(); } }

执行a.Sum:
1.先查抄申明类A 2.查抄到是虚拟要领 3.转去查抄实例类B,有重写的要领 4.执行实例类B中的要领 5.输出功效 I am B Class,I am override sum().
例3:

class A { public virtual void Sum() { Console.WriteLine("I am A Class,I am virtual sum()."); } } class B : A { public override void Sum() // 从头实现了虚函数 { Console.WriteLine("I am B Class,I am override sum()."); } } class C : B { } class Program { static void Main(string[] args) { A a=new C();// 界说一个a这个A类的东西.这个A就是a的申明类,实例化a东西,C是a的实例类   a.Sum(); Console.Read(); } }

执行a.Sum:
1.先查抄申明类A 2.查抄到是虚拟要领 3.转去查抄实例类C,无重写的要领 4.转去查抄类C的父类B,有重写的要领
5.执行父类B中的Sum要领 6.输出功效 I am B Class,I am override sum().  
例4:

class A { public virtual void Sum() { Console.WriteLine("I am A Class,I am virtual sum()."); } } class B : A { public new void Sum() //笼罩父类里的同名函数,而不是从头实现 { Console.WriteLine("I am B Class,I am new sum()."); } } class Program { static void Main(string[] args) { A a=new B(); a.Sum(); Console.Read(); } }