一.定义

简单的说,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,那么运行时将使用重写后的逻辑,如果没有重写,则使用父类中虚方法的逻辑。

定义关键字:virtual

重写关键字:override

二.实例

定义一个Person类与Person类的Student子类,如下:

 public class Person{public string  Name { get; set; }public virtual int Age { get; set; }public virtual void SayHello(){Console.WriteLine("大家好,我是"+this.Name+" 年龄"+this.Age);}public virtual int Add(int a){return this.Age+a;}}

假设现在学生类有如下需求:

1.需要在SayHello方法中增加学号的返回
2.需要对年龄做出校验,当年龄大于18岁时,直接返回18
  public class Student:Person{public string StuNO { get; set; }public override int Age{get => base.Age;            set => base.Age = value>18?18:value;}public override void SayHello(){Console.WriteLine("大家好,我是" + this.Name+",年龄"+this.Age+",我的学号是"+this.StuNO);}}

我们看到,针对需求1和2,重写了Age属性与SayHello方法,在控制台调用SayHello方法,调用方法如下:

 Person person = new Person();person.Name = "人";person.Age = 25;person.SayHello(); Student student = new Student();student.Name = "学生";student.Age = 25;//这里的年龄大于18student.StuNO = "001";student.SayHello();

结果如下图:

这个时候,我们在Student类中增加一个Add方法(不是重写),然后再重写父类中的Add方法,如下:

  public int Add(int a,int b) //这个是新方法,表明覆盖父类里的同名类,而不是重新实现{return this.Age + a + 10;}public override int Add(int a)  //这个是重写的父类中的Add方法{return base.Add(a)+666;}

这时,在控制台调用Add方法时,如果采用两个参数,则执行新方法,如果采用一个参数,则执行重写方法。
如果采用子类实例化父类的方式,如下:

Person aaa = new Student();
aaa.SayHello();

通过验证,我们会发现,这时的SayHello执行的是子类中重写的SayHello方法
关于子类与父类虚方法的实现顺序,在这里直接给出前人的总结:

1、当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;

2、如果不是虚函数,那么它就直接执行该函数。而如果有virtual关键字,也就是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是转去检查对象的实例类。

3、在这个实例类里,他会检查这个实例类的定义中是否有重新实现该虚函数(通过override关键字),如果是有,那么OK,它就不会再找了,而马上执行该实例类中的这个重新实现的函数。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。

至此,虚方法的总结结束…

最后,其实所有的数据测试可以在云服务器进行,大家可以看看腾讯云的相关服务,买来作为测试数据的服务器非常不错

C#进阶学习--虚方法(virtual)相关推荐

  1. C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载

    C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载 using System; using System.Collections.Generic; using Sys ...

  2. C#中虚方法(virtual)详解

    前言;在前面的博客重写中提到了虚方法和抽象类,本博文详细介绍下虚方法: 目录: 一.虚方法的定义: 二.虚方法的声明: 三.虚方法的调用: 四.虚方法的规则: 五.虚方法注意事项: 六.虚方法的好处: ...

  3. 虚方法(virtual)和抽象方法(abstract)的区别

    虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化.如: //抽象方法 pu ...

  4. 虚方法virtual详解(转载)

    从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的 ...

  5. java 虚函数_Java的虚方法

    虚方法出现在Java的多态特性中, 父类与子类之间的多态性,对父类的函数进行重新定义.如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).在Java中,子类 ...

  6. 虚方法、重写方法和抽象方法[转载]

    若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚方法 (virtual method).若其中没有 virtual 修饰符,则称该方法为非虚方法 (non-virtual metho ...

  7. 抽象类,虚方法,接口

    这三样很多人容易混淆,在此总结一下 1. 虚方法 Virtual 基类中定义了虚方法,派生类中可以实现,也可以不实现,因为虚方法是有方法体的,如果要实现,派生类中用override重写该方法. pub ...

  8. 重写方法,重载方法,虚方法和抽象方法的使用

    重写方法,重载方法,虚方法和抽象方法. 重写:指子类重新实现父类的某些方法,以实现一些新的功能.重写的关键字是override.并且重写的方法其签名是相同的. 重载:指允许类中具有相同函数名的方法,但 ...

  9. C++ day22 继承(二)基类指针数组通过虚方法实现智能的多态

    继承一共有三种: 公有继承 私有继承 保护继承 文章目录 公有继承 基类和派生类的关系 is-a(用公有继承表示"是一种"的关系) has-a uses-a is-like-a i ...

最新文章

  1. 如何构建一个安全的人工智能世界?
  2. 计算机四级分数怎么查,计算机三四级成绩查询正确打开方式
  3. gedit把关键字符替换为回车键
  4. Framer – 将视觉搞转换为更真实的动态原型
  5. 手动实现一个迷你版的AOP(实战增强版)
  6. SQLyog创建表示的bug
  7. Spring Security OAuth2.0_实现分布式认证授权_集成测试_Spring Security OAuth2.0认证授权---springcloud工作笔记155
  8. MySQL数据库MyISAM和InnoDB存储引擎的比较
  9. es文件浏览器怎么用_ES文件浏览器——安卓第一文件管理APP
  10. 我学Delphi心得及笔记----用户自定义数据类型(第三讲)
  11. telnet不通linux下tomcat端口
  12. 关于excel数据透视表的数据填充
  13. 联想云计算机终端,联想智能云教室系统 V1.3.20.1109_C201105 最新官网版本
  14. C语言华氏摄氏度转换
  15. Foxmail设置方法
  16. java获取outlook 日历,Outlook 日历 API 概述
  17. 某东薅羊毛脚本分析 如何自己薅羊毛
  18. PWM常见输出方法及避坑指南
  19. 小猴吃桃matlab,幼儿园小班水墨画教案《小猴吃桃》
  20. 数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)

热门文章

  1. android版本号小游戏,安卓端微信7.0.16版本运行小游戏问题
  2. 计算机软件行业大部分成本是,平狄克微观经济学第七章成本问题
  3. MacBook可为手机手表无线充电
  4. 数据结构实验之——哈夫曼树的实现
  5. Lua初探(一)简介
  6. Qt在线安装教程(详细图文)
  7. 如何用Python绘制圣诞树(极其鬼畜视频) - B站小视频
  8. flutter 唤起微信 唤起其他应用
  9. 《信息用户与服务》第四版目录 胡昌平、胡潜、邓胜利著
  10. 微信小程序+前端+天行数据垃圾图像识别接口API