C++ virtual关键字
一、序言
在面向对象的C++语言中,virtual关键字是用来描述虚函数的,虚函数(virtual function)是一个非常重要的概念。
二、虚函数
2.1 实例代码
虚函数是指一个类中希望被重载的成员函数,当使用一个基类指针或引用指向一个继承类对象的时候,调用一个虚函数时, 实际调用的是继承类的版本。
#include <iostream>
using namespace std;class Parent
{ public:char data[20];void Function1(); virtual void Function2(); // 这里声明Function2是虚函数}parent;void Parent::Function1(){//"::"是域操作符,表示Function1函数是Parent类的成员变量printf("This is parent,function1\n");}void Parent::Function2(){printf("This is parent,function2\n");}class Child:public Parent{void Function1();void Function2();} child;void Child::Function1(){printf("This is child,function1\n");}void Child::Function2(){printf("This is child,function2\n");}int main(int argc, char* argv[]){Parent *p; // 定义一个基类指针if(_getch()=='c') // 如果输入一个小写字母c p=&child; // 指向继承类对象else p=&parent; // 否则指向基类对象p->Function1(); // 这里在编译时会直接给出Parent::Function1()的入口地址。 p->Function2(); // 注意这里,执行的是哪一个Function2?return 0;}
2.2 编译运行
编译运行该段代码,输入一个小写字母c,得到下面的结果:
This is parent,function1
This is child,function2
2.3 结果解析
首先说明:
"::" 表示 “域操作符” ,比如声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时, 就要写成void A::f(),表示这个f()函数是类A的成员函数。
(1)编译运行后,为什么会有第一行的结果呢?
因为我们是用一个Parent类的指针调用函数Fuction1(),虽然实际上这个指针指向的是Child类的对象,但编译器无法知道这一事实(直到运行的时候,程序才可以根据用户的输入判断出指针指向的对象),它只能按照调用Parent类的函数来理解并编译,这就是静态联编,所以我们看到了第一行的结果。
(2)那么第二行的结果又是怎么回事呢?
我们注意到,Function2()函数在基类中被virtual关键字修饰,也就是说,它是一个虚函数。虚函数最关键的特点是“动态联编”,它可以在运行时判断指针指向的对象,并自动调用相应的函数。
(3)如果我们在运行上面的程序时任意输入一个非c的字符,结果如下:
This is parent,function1
This is parent,function2
请注意看第二行,它的结果出现了变化。程序中仅仅调用了一个Function2()函数,却可以根据用户的输入自动决定到底调用基类中的Function2还是继承类中的Function2,这就是虚函数的作用。
一定要注意“静态联翩 ”和“ 动态联编 ”的区别;
附录
参考:C++中virtual(虚函数)的用法 - 唯一诺 - 博客园
C++ virtual关键字相关推荐
- override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字
1.override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字 #include <iostream> //C++中的final和override主要是 ...
- C++中virtual关键字的用法
关于virtual关键字的用法总结如下,有错误或者总结不到位的情况请能帮本人指出,非常感谢! Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virt ...
- virtual关键字的使用(C# 参考)
virtual 关键字用于修饰方法.属性.索引器或事件声明,并且允许在派生类中重写这些对象.例如,此方法可被任何继承它的类重写. 1public virtual double Area() 2{ 3 ...
- 浅析C#中new、override、virtual关键字的区别
OO思想现在已经在软件开发项目中广泛应用,其中最重要的一个特性就是继承,最近偶简单的复习了下在C#中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来,方便大家查阅. 一.在C# ...
- 【学习笔记】C++ 中的 virtual 关键字与虚函数
目录 先决条件 前言 演示示例 virtual 关键字的作用 虚函数的规则 参考与拓展 深入拓展 先决条件 了解 C++ 中的多态这个概念. 前言 virtual 关键字是面对对象中,用于修饰类中的成 ...
- EF实体类种的Virtual关键字作用
在使用EF中我们会使用导航属性,其中会加上Virtual关键字,这个有什么作用呢.加了此关键字就可以使用lazyload懒加载,不加此特性的话是加载不出此导航属性的内容的. 例子,有两个实体sys_u ...
- 浅析c++中virtual关键字
1.virtual关键字主要是什么作用? c++中的函数调用默认不适用动态绑定.要触发动态绑定,必须满足两个条件:第一,指定为虚函数:第二,通过基类类型的引用或指针调用. 由此可见,virtual主要 ...
- c语言使用virtual类型,c语言virtual关键字
只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖.当基类 ...
- C++的动态多态,Virtual关键字的作用
1.虚函数 virtual用来修饰父类函数中的普通函数,子类可以通过重写(与父类中的普通函数同名同参数)来覆盖父类中的函数的输出结果,即程序在运行时调用的是子类中的函数而不是父类.注 ...
最新文章
- php随机生成器加密,php生成随机密码的几种方法
- python迷宫小游戏代码_C++课程设计迷宫小游戏
- tf.placeholder类似函数中的形参
- 内网突破SSL嗅探的探究
- 软件工程学习笔记《二》代码规范
- fusioncharts json java,FusionCharts使用教程:利用XML/JSON属性加载外部LOGO
- linux设备驱动归纳总结(八):1.总线、设备和驱动【转】
- 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)
- sed手册-3 例子
- linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用
- 无法更新计算机的启动配置 注册表,win10改win7系统卡在安装程序正在更新注册表设置怎么办...
- 实验6 地理数据可视化
- 无参考图像质量评价——漏勺模型
- 将字符串中的大写字母转换为小写字母
- cad直线和圆弧倒角不相切_数控加工中心如何使用任意角度倒角C和倒圆角R功能的编程...
- 团队作业8----第二次项目冲刺(Beta阶段) 第五天
- 32位二进制里有多少个1
- linux配置yum源的三种方法:
- android 打印小票格式,安卓端小票机设置
- QQ空间JS代码原理
热门文章
- Javascript入门阶段——else if语句
- kingscada检测服务器状态,基于云服务器的状态检测平台
- android 日历没有提醒功能,如何在Android 4中无提示地将日历事件添加到默认日历中而无任何提示?...
- Java基础面试题干货系列(一)
- 微软亚洲研究院4人团队完成视觉识别里程碑式突破
- 智能手机操作系统市场份额
- Mac 音频转换器推荐 DRmare Audio Converter、Audi Free Auditor
- 微软的漏洞 MS06-007 更新了 KB 913446 tcpip.sys 所以导致 大家bt 电驴下载过慢
- C语言指针学习(6)指针数组-字符指针数组
- matlab中的小波变换,小波变换在matlab中的使用