简单介绍虚函数virtual

在某基类中声明 virtual 并在一个或多个派生类中被重新定义的成员函数称为虚函数。

虚函数的作用就是实现多态性(Polymorphism),多态性是将接口与实现进行分离。

C#作为完全面向对象语言,所有函数并不默认为virtual,但可以在基类中声明关键字virtual,就可以在其派生类中通过关键字override重写该函数。重写后的virtual函数依旧是virtual函数。由于virtual只对类中的实例函数成员有意义,所以成员字段和静态函数都不能声明为virtual,也不能与override和abstract一起用。

虚函数与一般函数的区别

一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中声明时定义的类叫声明类,执行时实例化的类叫实例类。

使用虚函数virtual

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

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

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

实例:

运行结果:

常见面试题:

class Program
{class A{public A(){PrintFields();}public virtual void PrintFields() { }}class B : A{int x = 1;int y;public B(){y = -1;}public override void PrintFields(){Console.WriteLine("x={0},y={1}", x, y);}}static void Main(string[] args){new B();            }
}

问:当使用new B()创建B的实例时,产生什么输出?

答:x=1,y=0

解析:创建B的实例,先隐式调用父类A的无参构造函数,执行PrintFields()方法,检查到是虚方法,转去检查实例类B,有重载方法,执行重载方法,输出x=1,y=0

注意:创建子类对象时会首先调用父类的构造函数,然后才会调用子类本身的构造函数,如果没有指明要调用父类的哪一个构造函数,系统会隐式地调用父类的无参构造函数

C#中的虚函数virtual相关推荐

  1. C++中的虚函数(virtual function)

    1回顶部 一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class A { public: virtua ...

  2. c 语言的虚函数,C 中的虚函数(virtual function)

    一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class Father { public: virtua ...

  3. C++中最好不要在构造函数和析构函数中调用虚函数!!!

    1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...

  4. C++中的虚函数与纯虚函数

    文章目录 1 C++中的虚函数 1.1 虚函数 1.2 单个类的虚函数表 1.3 使用继承的虚函数表 1.4 多重继承的虚函数表 2 C++中的纯虚函数 1 C++中的虚函数 1.1 虚函数 虚函数的 ...

  5. C# 构造函数中调用虚函数

    C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...

  6. C++学习笔记-----不要在构造函数和析构函数中调用虚函数

    考虑下面的程序: #include <iostream> using namespace std;class Base { public:Base() { cout << &q ...

  7. C++学习笔记-----永远不要在派生类中改变虚函数的默认参数值

    提到虚函数,我们就会自然而然的想到多态,但是当虚函数中存有默认参数值的时候,在派生类中重定义这个虚函数时不可以改变这个参数的值. 请看下面的例子: #include "stdafx.h&qu ...

  8. C++中最好不要在构造函数和析构函数中调用虚函数

    1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...

  9. MFC中关于虚函数的一些问题

    这个是C++中虚函数以及多态性. 我们知道,如果派生类中重定义了基类中的虚函数,即使用基类的类型指针调用该函数,那么实际上连编的是派生类的函数.比如, class A { virtual void o ...

最新文章

  1. 2021年春季学期-信号与系统-第一次作业参考答案-第五题
  2. oralce中级OCP考试时间和题量以及通过率
  3. 在计算机桌面怎么找打印机,win10系统电脑打印机图标找回来的教程
  4. c#快捷键(成为高手必备)
  5. oracle10g导入dmp文件恢复,oracle 10g 恢复dmp文件。
  6. mysql and 和where_如何使用mysql查询where条件里的or和and
  7. 关于专注,关于最近的一些事情
  8. hive 建表_大数据面试必备 | Hive数据仓工具面试题!
  9. datatable插件实现分页功能
  10. Dubbo使用_尚硅谷视频学习笔记
  11. 如何使用python进行社交网络分析
  12. LSB图像数字水印嵌入算法(含python代码)
  13. ENVI/ArcGIS根据坐标位置提取影像DN值(批量)
  14. tplink 无线打印服务器,tplink打印服务器设置
  15. sql insert
  16. 0x00007FFE51EF1208 (ucrtbase.dll)considers invalid parameters fatal.
  17. eclipse 打包springcloud 项目出错怎么解决
  18. Vue学习之基础大全
  19. AVUE一些简单用法——avue-crud子表单
  20. 叶公好龙——存在与逻辑

热门文章

  1. 视频直播方案(播放器和SDK)
  2. 0xc0000001代码错误 Win10
  3. 云计算、大数据能为反恐做什么?
  4. js 实现页面朗读功能,利用百度语音API
  5. 算法笔记——曼哈顿距离,切比雪夫距离,曼哈顿距离之和 P3964 [TJOI2013]松鼠聚会
  6. halcon像素统计_Halcon(八)亚像素轮廓XLD
  7. 搜索引擎不收录网站页面的常见原因
  8. 桂电的计算机专业研究生录取比例,桂电研究生就业待遇 桂林电子科技大学就业率...
  9. 医院计算机招聘笔试内容是什么,医院招聘考试的“内幕”难道你不想知道吗?...
  10. 旅游规划pta(无向图求顶点间最短路径)