标签:一个 修饰符 pre 就是 判断 div asp.net run over
1.虚方法关键字?
Virtual
2.虚方法运行的周期?
虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,执行实例化的那个类叫做实例类。
3.函数运行的检查流程:
1当调用一个对象的函数时,系统会直接去检查这个对象的申明定义的类(申明类),检查调用的函数是否为虚函数,如果不是虚函数,那么它就执行该函数。而如果有Viirtual关键字(虚函数),那么它
就不会立即执行该函数。而是转去检查对象的实例类。在这个实例类里,它会检查这个实例类中是否有重现实现该函数(Override),如果有就不再找了,马上执行该实例类中的这个重新实现的函数
而如果每天有,系统就会不停的往上找实例类,直到找到第一个重载了该函数的父类为止,然后执行父类里重载后的的函数
另注意:虚函数里必须有方法体。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleHelp { public class RunVirtual { /// <summary> /// 虚方法说明以及代码 /// </summary> public void TestRunVirtual() { //注意:虚方法不允许static, abstract, 或override 修饰符 TestA A;// 定义一个a这个A类的对象.这个A就是a的申明类 TestA B;// 定义一个b这个A类的对象.这个A就是b的申明类 TestA C;// 定义一个c这个A类的对象.这个A就是b的申明类 TestA D;// 定义一个d这个A类的对象.这个A就是b的申明类 A = new TestA();// 实例化a对象,A是a的实例类 B = new TestB();// 实例化b对象,B是b的实例类 C = new TestC();// 实例化b对象,C是b的实例类 D = new TestD();// 实例化b对象,D是b的实例类 A.Fuctio();//先检查声明类A,发现是虚函数,跳出检查实例类即为本身,执行A的Fuctio方法 B.Fuctio();//先检查声明类A,发现是虚函数,跳出检查实例类,实例类B中有重写,执行重写方法Fuctio C.Fuctio();//先检查声明类A,发现是虚函数,跳出检查实例类,实例类C中没有重写,找父类B(继承了B类),执行B类中重写方法Fuctio D.Fuctio();//先检查声明类A,发现是虚函数,跳出检查实例类,实例类D中虽然有声明了Fuctio方法,但并没有重写Fuction,找父类A,发现为本身,执行A类的Fuctio } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleHelp { public class TestA { public virtual void Fuctio() { Console.Write("Fuction in A"); } } public class TestB:TestA { public override void Fuctio() { Console.Write("Fuction in B"); } } public class TestC : TestB { } public class TestD : TestA { public void Fuctio() { Console.Write("Fuction in D"); } } }
标签:一个 修饰符 pre 就是 判断 div asp.net run over
原文地址:https://www.cnblogs.com/JohnTang/p/10325894.html