C#中的虚函数virtual
简单介绍虚函数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相关推荐
- C++中的虚函数(virtual function)
1回顶部 一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class A { public: virtua ...
- c 语言的虚函数,C 中的虚函数(virtual function)
一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class Father { public: virtua ...
- C++中最好不要在构造函数和析构函数中调用虚函数!!!
1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...
- C++中的虚函数与纯虚函数
文章目录 1 C++中的虚函数 1.1 虚函数 1.2 单个类的虚函数表 1.3 使用继承的虚函数表 1.4 多重继承的虚函数表 2 C++中的纯虚函数 1 C++中的虚函数 1.1 虚函数 虚函数的 ...
- C# 构造函数中调用虚函数
C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...
- C++学习笔记-----不要在构造函数和析构函数中调用虚函数
考虑下面的程序: #include <iostream> using namespace std;class Base { public:Base() { cout << &q ...
- C++学习笔记-----永远不要在派生类中改变虚函数的默认参数值
提到虚函数,我们就会自然而然的想到多态,但是当虚函数中存有默认参数值的时候,在派生类中重定义这个虚函数时不可以改变这个参数的值. 请看下面的例子: #include "stdafx.h&qu ...
- C++中最好不要在构造函数和析构函数中调用虚函数
1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...
- MFC中关于虚函数的一些问题
这个是C++中虚函数以及多态性. 我们知道,如果派生类中重定义了基类中的虚函数,即使用基类的类型指针调用该函数,那么实际上连编的是派生类的函数.比如, class A { virtual void o ...
最新文章
- 2021年春季学期-信号与系统-第一次作业参考答案-第五题
- oralce中级OCP考试时间和题量以及通过率
- 在计算机桌面怎么找打印机,win10系统电脑打印机图标找回来的教程
- c#快捷键(成为高手必备)
- oracle10g导入dmp文件恢复,oracle 10g 恢复dmp文件。
- mysql and 和where_如何使用mysql查询where条件里的or和and
- 关于专注,关于最近的一些事情
- hive 建表_大数据面试必备 | Hive数据仓工具面试题!
- datatable插件实现分页功能
- Dubbo使用_尚硅谷视频学习笔记
- 如何使用python进行社交网络分析
- LSB图像数字水印嵌入算法(含python代码)
- ENVI/ArcGIS根据坐标位置提取影像DN值(批量)
- tplink 无线打印服务器,tplink打印服务器设置
- sql insert
- 0x00007FFE51EF1208 (ucrtbase.dll)considers invalid parameters fatal.
- eclipse 打包springcloud 项目出错怎么解决
- Vue学习之基础大全
- AVUE一些简单用法——avue-crud子表单
- 叶公好龙——存在与逻辑
热门文章
- 视频直播方案(播放器和SDK)
- 0xc0000001代码错误 Win10
- 云计算、大数据能为反恐做什么?
- js 实现页面朗读功能,利用百度语音API
- 算法笔记——曼哈顿距离,切比雪夫距离,曼哈顿距离之和 P3964 [TJOI2013]松鼠聚会
- halcon像素统计_Halcon(八)亚像素轮廓XLD
- 搜索引擎不收录网站页面的常见原因
- 桂电的计算机专业研究生录取比例,桂电研究生就业待遇 桂林电子科技大学就业率...
- 医院计算机招聘笔试内容是什么,医院招聘考试的“内幕”难道你不想知道吗?...
- 旅游规划pta(无向图求顶点间最短路径)