一、序言

在面向对象的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关键字相关推荐

  1. override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字

     1.override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字 #include <iostream> //C++中的final和override主要是 ...

  2. C++中virtual关键字的用法

    关于virtual关键字的用法总结如下,有错误或者总结不到位的情况请能帮本人指出,非常感谢! Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virt ...

  3. virtual关键字的使用(C# 参考)

    virtual 关键字用于修饰方法.属性.索引器或事件声明,并且允许在派生类中重写这些对象.例如,此方法可被任何继承它的类重写. 1public virtual double Area()  2{ 3 ...

  4. 浅析C#中new、override、virtual关键字的区别

    OO思想现在已经在软件开发项目中广泛应用,其中最重要的一个特性就是继承,最近偶简单的复习了下在C#中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来,方便大家查阅. 一.在C# ...

  5. 【学习笔记】C++ 中的 virtual 关键字与虚函数

    目录 先决条件 前言 演示示例 virtual 关键字的作用 虚函数的规则 参考与拓展 深入拓展 先决条件 了解 C++ 中的多态这个概念. 前言 virtual 关键字是面对对象中,用于修饰类中的成 ...

  6. EF实体类种的Virtual关键字作用

    在使用EF中我们会使用导航属性,其中会加上Virtual关键字,这个有什么作用呢.加了此关键字就可以使用lazyload懒加载,不加此特性的话是加载不出此导航属性的内容的. 例子,有两个实体sys_u ...

  7. 浅析c++中virtual关键字

    1.virtual关键字主要是什么作用? c++中的函数调用默认不适用动态绑定.要触发动态绑定,必须满足两个条件:第一,指定为虚函数:第二,通过基类类型的引用或指针调用. 由此可见,virtual主要 ...

  8. c语言使用virtual类型,c语言virtual关键字

    只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖.当基类 ...

  9. C++的动态多态,Virtual关键字的作用

     1.虚函数         virtual用来修饰父类函数中的普通函数,子类可以通过重写(与父类中的普通函数同名同参数)来覆盖父类中的函数的输出结果,即程序在运行时调用的是子类中的函数而不是父类.注 ...

最新文章

  1. php随机生成器加密,php生成随机密码的几种方法
  2. python迷宫小游戏代码_C++课程设计迷宫小游戏
  3. tf.placeholder类似函数中的形参
  4. 内网突破SSL嗅探的探究
  5. 软件工程学习笔记《二》代码规范
  6. fusioncharts json java,FusionCharts使用教程:利用XML/JSON属性加载外部LOGO
  7. linux设备驱动归纳总结(八):1.总线、设备和驱动【转】
  8. 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)
  9. sed手册-3 例子
  10. linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用
  11. 无法更新计算机的启动配置 注册表,win10改win7系统卡在安装程序正在更新注册表设置怎么办...
  12. 实验6 地理数据可视化
  13. 无参考图像质量评价——漏勺模型
  14. 将字符串中的大写字母转换为小写字母
  15. cad直线和圆弧倒角不相切_数控加工中心如何使用任意角度倒角C和倒圆角R功能的编程...
  16. 团队作业8----第二次项目冲刺(Beta阶段) 第五天
  17. 32位二进制里有多少个1
  18. linux配置yum源的三种方法:
  19. android 打印小票格式,安卓端小票机设置
  20. QQ空间JS代码原理

热门文章

  1. Javascript入门阶段——else if语句
  2. kingscada检测服务器状态,基于云服务器的状态检测平台
  3. android 日历没有提醒功能,如何在Android 4中无提示地将日历事件添加到默认日历中而无任何提示?...
  4. Java基础面试题干货系列(一)
  5. 微软亚洲研究院4人团队完成视觉识别里程碑式突破
  6. 智能手机操作系统市场份额
  7. Mac 音频转换器推荐 DRmare Audio Converter、Audi Free Auditor
  8. 微软的漏洞 MS06-007 更新了 KB 913446 tcpip.sys 所以导致 大家bt 电驴下载过慢
  9. C语言指针学习(6)指针数组-字符指针数组
  10. matlab中的小波变换,小波变换在matlab中的使用