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");
}
}
}

 

ASP.NET之虚方法的更多相关文章

  1. asp.net 抽象方法和虚方法的用法区别,用Global类重写Application_BeginRequest等方法为例子

    不废话,直接贴代码 public abstract class LogNetGlobal : System.Web.HttpApplication { protected void Applicati ...

  2. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  3. 重写ValidateEntity虚方法实现可控的上下文验证和自定义验证

    上篇文章介绍了ValidationAttribute和IValidatableObject.Validate验证,但是这种验证还是稍微简单了,对于复杂的实体,例如:继承过来的实体.实现某接口的实体等等 ...

  4. Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息

    Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...

  5. 《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)

    前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...

  6. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  7. 为何JAVA虚函数(虚方法)会造成父类可以"访问"子类的假象?

      首先,来看一个简单的JAVA类,Base. 1 public class Base { 2 String str = "Base string"; 3 protected vo ...

  8. C++虚方法(虚函数)随笔

    本文不讨论虚函数的原理,只简单总结下虚函数的常用事项. 虚函数(虚方法)是C++动态联编 实现多态的重要手段,在函数声明时使用关键字virtual即可,如: virtual void func(voi ...

  9. 【jq】c#零基础学习之路(3)继承和虚方法

    c#只能继承一个基类和多个接口(0+) 父类:Human: class Human { public virtual Move() { Console.WriteLine("Human的虚方 ...

随机推荐

  1. C. Vasya and Robot二分

    1.题目描述 Vasya has got a robot which is situated on an infinite Cartesian plane, initially in the cell ...

  2. Servlet实践--HelloWorld

    Servlet规范是一套技术标准,包含与Web应用相关的一系列接口,而具体的Servlet容器负责提供标准的实现,如Tomcat. Servlet的实例对象由Servlet容器负责创建,Servlet ...

  3. centos下静默安装oracle11g

    一.安装依赖包 yum -y install gcc make binutils gcc-c++ compat-libstdc++-33 elfutils-libelf-devel elfutils- ...

  4. idea创建第一个普通java web项目

    1.新建项目(工作空间) 选择空项目 输入项目名称,点击完成 系统会默认选中Modules,点击上面的小+号创建模块->New Module 新建一个Java EE Web Applicatio ...

  5. WIN10远程计算机不支持所需的FIPS安全级别解决

    win10系统的电脑在远程xp系统或者其他系统的电脑时,提示错误,远程计算机可能不支持所需的FIPS安全级别,如果出现一以下2种错误,可以解决!   1 第一步:打开win10下的,控制面板 2 第二 ...

  6. 20175320 2018-2019-2 《Java程序设计》第6周学习总结

    20175320 2018-2019-2 <Java程序设计>第6周学习总结 教材学习内容总结 本周学习了教材的第七及第十章的内容.在这两章中介绍了接内部类与异常类以及输入.输出流,第七章 ...

  7. 安装Nginx到linux服务器(Ubuntu)详解

    先去下载一个nginx放到服务器. 然后解压(可参考前面安装tomcat)编译(./configure --prefix=/usr/local/nginx/server/ && mak ...

  8. 如何安装 MySql 5.7.22

    你首先得去官网去下载一个zip文件,https://dev.mysql.com/downloads/mysql/ 以我所选版本为例,选择MYSQL Community Server 然后在右边选择你所 ...

  9. SCRIPT438: 对象不支持“indexOf”属性或方法

    SCRIPT438: 对象不支持“indexOf”属性或方法 indexOf()的用法:返回字符中indexof(string)中字串string在父串中首次出现的位置,从0开始!没有返回-1:方便判 ...

  10. mysql储存过程入门学习

    转载至:https://www.yiibai.com/mysql/getting-started-with-mysql-stored-procedures.html 1.mysql储存过程的创建 DE ...