刚开始学C++学到“类”这一章的时候一直不明白虚函数用来做什么。看书上举的例子不太明白。

#include<iostream>
using namespace std;class Father
{
public:void Show(){cout<<"父类Show函数"<<endl;}
};class Son:public Father
{
public:void Show(){cout<<"子类Show函数"<<endl;}
};int main()
{Father *p = new Son;p->Show();delete p;
}

运行结果为:父类Show函数

用父类指针指向子类对象,如果不将Show函数声明为虚函数,最终调用的是父类Show函数,而不是我们派生后重写的Show函数。如果将Show函数声明为虚函数,那么上述代码运行后将输出:子类Show函数

#include<iostream>
using namespace std;class Father
{
public:void Show(){cout<<"父类Show函数"<<endl;}
};class Son:public Father
{
public:void Show(){cout<<"子类Show函数"<<endl;}
};int main()
{Son a;a.Show();
}

运行结果为:子类Show函数

我就纳闷了,为什么要用父类指针指向子类对象呢?这根本不需要声明为虚函数啊,直接定义一个子类对象,或是用子类指针指向子类对象,再来调用Show函数,即使不用声明为虚函数,也能调用我们派生后重写的Show函数啊。

虽然这样说,但是实际开发过程中不是这样的,当我们使用一些类库、框架的时候,这些类库、框架是事先就写好的。我们在使用的时候不能直接修改类库的源码,我们只能派生类库中的类来覆盖一些成员函数以实现我们的功能,但这些成员函数有的是由框架调用的。这种情况下,用虚函数是很好的办法。

#include<iostream>
using namespace std;class Father
{void Put(){cout<<"父类Put函数"<<endl;}
public:void Show(){Put();}
};class Son:public Father
{void Put(){cout<<"子类Put函数"<<endl;}
};int main()
{Son a;a.Show();
}

运行结果为:父类Put函数

看上面的代码,把父类Father看做一个已经写好的框架、类库中的类,子类Son为我们派生出来的类。私有成员函数Put是由公有的Show函数来调用的,我们虽然派生后重写了Put函数,并且也是用子类对象来调用Show函数,Show函数又调用Put函数。运行后发现,结果调用的还是父类的Put函数,并没有调用我们重写的Put函数。我们把上面代码的Put函数声明为虚函数再来看。

#include<iostream>
using namespace std;class Father
{virtual void Put(){cout<<"父类Put函数"<<endl;}
public:void Show(){Put();}
};class Son:public Father
{virtual void Put(){cout<<"子类Put函数"<<endl;}
};int main()
{Son a;a.Show();
}

运行结果为:子类Put函数

可以发现,声明为虚函数后,成功的调用了我们重写的Put函数。这就是虚函数的一个超典型的作用。

在面向过程的C语言中,在需要框架、类库回调我们自定义的函数的时候,往往是传入一个函数指针,让框架回调。

在面向对象的C++中,为了实现同样的目的,框架往往准备好了什么也不干的虚函数,由我们派生后重写这个虚函数,来实现我们的自定义功能。随后,框会调用这个虚函数。效果如图面向过程语言中的回调。

虚函数有什么用,什么时候用相关推荐

  1. C++ 虚函数与存虚函数

    什么是虚函数: 虚函数 是在基类中使用关键字 virtual 声明的函数,在C++ 语言中虚函数可以继承,当一个成员函数被声明为虚函数之后,其派生类中的同名函数都自动生成为虚函数, 虚函数主要体验C+ ...

  2. 【C++】多态(早期绑定、后期绑定)、抽象类(纯虚函数)、虚析构函数

    我们都知道面向对象编程的三大特征是封装.继承.多态,今天我们就来说一下其中之一的多态. 概念: 多态: 多态字面意思就是多种形态,C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同 ...

  3. C#中虚函数,抽象,接口的简单说明

    虚函数:由virtual声明,它允许在派生类中被重写,要重写方法,必须先声名为virtual public class myclass { public virtual int myint() { 函 ...

  4. 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码

    虚函数:在以下几个方面,虚函数可能会造成性能损失:构造函数必须初始化vptr(虚函数表):虚函数是通过指针间接调用的,所以必须先得到指向虚函数表的指针,然后再获得正确的函数偏移量:内联是在编译时决定的 ...

  5. 但并不从包含函数声明的接口派生_C++的虚函数和纯虚函数

    虚函数:类成员函数前面添加virtual关键字,则该函数被称为虚函数. 纯虚函数:在虚函数的基础上,在函数末尾加上 = 0. class Animal {public: virtual void Sh ...

  6. c++ 虚函数_到底什么情况下会合成默认构造函数?

    来源:https://www.cnblogs.com/QG-whz/p/4676481.html 作者:good luck 编辑:公众号[编程珠玑] 编辑注:没有构造函数的时候编译器一定会生成默认构造 ...

  7. C++——虚函数(Virtual Member Functions) 【functions语意学】

    单继承下的虚函数 虚函数的实现: 为每个有虚函数的类配一张虚函数表(virtual table),它存储该类类型信息和所有虚函数执行期的地址. 为每个有虚函数的类插入一个指针(vptr),这个指针指向 ...

  8. 一口气搞懂《虚函数和纯虚函数》

    学习C++的多态性,你必然听过虚函数的概念,你必然知道有关她的种种语法,但你未必了解她为什么要那样做,未必了解她种种行为背后的所思所想.深知你不想在流于表面语法上的蜻蜓点水似是而非,今天我们就一起来揭 ...

  9. 虚函数实现的基本原理(转载)

    1.概述 每一个含有虚函数(无论是其本身就含有的,还是从基类继承过来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.如下图所示 : 其中: B的虚函数表中存放着B:: ...

  10. C++中虚函数可以是内联函数吗?

    1.需要注意的几点: 虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联. 内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因 ...

最新文章

  1. SpringBoot mybatis 输出SQL语句到控制台
  2. 为什么需要权重初始化(weight initialization)?常见的权重初始化方式有哪些?启发式权重初始化的好处?
  3. UTXO 与账户余额模型
  4. hexo 菜单_Hexo 搭建个人博客教程 - 6 - 设置菜单,发布博客 - 2018
  5. 汇编中addr和offset
  6. QT QML 在qml中自定义信号
  7. 后台系统可扩展性学习笔记
  8. vs2013链接Mysql时出现 (由于找不到libmysql.dll,无法继续执行代码。重新安装程序可能会解决此问题)
  9. 圆章能随便刻吗_自己晒干的蒲公英能长期当茶随便喝吗?医生:3个危害不请自来...
  10. 监督学习之knn、naive bayes、决策树算法实验_机器学习基本概念
  11. match_parent和fill_parent有什么区别?
  12. VS2019 windows桌面应用_基于.Net Core平台开发WinForms应用程序
  13. 菱形(两种数组方法)
  14. 手机直播系统,仿映客直播程序项目需求
  15. windows商店直接安装ubuntu子系统
  16. 普元框架-那些年一起走过的坑
  17. peewee操作mysql_Peewee 使用
  18. ps快速将白底图片变为透明图片
  19. sja1000编程c语言,CAN总线控制器-SJA1000源程序(c语言)资料.doc
  20. 烧钱?公交免费Wi-Fi面临三大挑战

热门文章

  1. 宁盾动态密码案例: 国内某大型油田OA集成dKey动态口令牌认证功能
  2. oracle未过账凭证删除,金蝶未过账凭证如何取消关联凭证?
  3. winserver2008安装时出现 缺少所需的 CD/DVD驱动器设备驱动程序。如果您具有软盘....
  4. 九龙证券|主力斥近8亿元暴拉设备龙头,多股已获连续加仓
  5. 服务器该怎样去维护管理
  6. 定时任务框架Quartz-(一)Quartz入门与Demo搭建
  7. 从零开始前端学习[36]:Cs3中的3D效果实现
  8. 备考初期,这十大心理弱点,你中了几条?
  9. Unity编辑器拓展(Gizmos)
  10. 视觉机器学习20讲-MATLAB源码示例(4)-决策树学习算法