声明虚函数的方法是在基类中的成员函数原型前加上关键字virtual.格式如下:

class 类名{

……

virtual 类型 函数名(参数表);

……

};

当一个类的成员函数声明为虚函数后,这就意味着该成员函数在派生类中可能有不同的实现,也就是说,该函数在派生类中可能需要定义与其基类虚函数原型相同的函数。

虚函数是动态联编的基础,当用基类类型的指针或引用的方法指向不同派生类对象时,系统会在程序运行中根据所指向对象的不同自动选择适当的函数,从而实现了运行时的多态性。

当通过基类指针或引用标识对象并调用成员函数时,由于基类指针可以指向该基类的不同派生类对象,因此存在需要动态联编的可能性,但具体是否使用动态联编,还要看所调用的是否是虚函数。

虚函数可以在一个或多个派生类中被重新定义,但它要求在派生类中重新定义时必须与基类中的函数原型完全相同,包括函数名、返回值类型、参数个数和参数类型的顺序。

只有类的成员函数才能声明为虚函数,但类的构造函数以及全局函数和静态成员函数不能声明为虚函数。

class A { public: virtual void f() { cout << "A::f" << endl; } }; class B :public A{ public: virtual void f() { cout << "B::f" << endl;} }; class C :public A { public: virtual void f() { cout << "C::f" << endl;} }; class Drive : public C { public: virtual void f() { cout << "D::f" << endl;} }; int main(int argc, char* argv[]) { A a; B b; C c; Drive d; a.f(); b.f(); c.f(); d.f(); return 0; } //结果:A::f B::f C::f D::f

描述多态时,我们常用这样的话:“一种接口,多种方法”。

虚函数和一般函数(早绑定与晚绑定):绑定的英文名为binding:把函数体和函数调用相联系称为绑定。
类中的一般的函数都是早绑定,也就是说:在调用的地方,就已经把要调用的函数确定好了,调用的类就是定义它的类。

多态的时候,都是用晚绑定,比如你的父类中定义了virtual的方法,那么这个方法可能会在你的子类中重载,具体你用什么子类,是变量申明时所不知道的,在C++编译器会在编译的时候为这些类加上一个指针,指针指向一个虚表,虚表中存在着真实的函数,这个是就是一个晚绑定了

早绑定的优点是:

  • 编译效率
  • 代码提示(代码智能感知)
  • 编译时类型检查

晚绑定的优点是:

  • 不用申明类型
  • 对象类型可以随时更改

《C++捷径教程》学习笔记【一】:虚函数相关推荐

  1. IOS学习笔记07---C语言函数-scanf函数

    2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072            ...

  2. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  3. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  4. 黑马程序员最新版JavaWeb基础教程-学习笔记

    da@黑马程序员最新版JavaWeb基础教程-学习笔记 day06-HTML&CSS HTML HTML(HyperTest Markup Language):超文本标记语言 是一门语言,所有 ...

  5. 【从零开始的大数据学习】Flink官方教程学习笔记(一)

    Flink官方教程学习笔记 学习资源 基础Scala语法 Scala数据结构专题 声明变量 代码块 函数(function) 方法(methods) Traits (接口) class(类) tupl ...

  6. Python基础教程-菜鸟教程学习笔记1

    Python基础教程-菜鸟教程学习笔记1 文章目录 Python基础教程-菜鸟教程学习笔记1 前言 Python 简介 1. 第一个Python程序 2. Python 中文编码 3. 基本语法 1) ...

  7. SQL数据库教程-学习笔记2

    SQL数据库教程-学习笔记2 文章目录 SQL数据库教程-学习笔记2 三.DML语言的学习 1.插入语句:insert into 2.修改语句:update 3.删除语句:delete 4.练习题 四 ...

  8. Linux教程学习笔记

    Linux教程学习笔记 目录 Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 ...

  9. 大数据Hadoop教程-学习笔记01【大数据导论与Linux基础】

    视频教程:哔哩哔哩网站:黑马大数据Hadoop入门视频教程,总时长:14:22:04 教程资源:https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g,提取码: ...

  10. Vue数据代理+事件处理+事件修饰符的作用+计算属性的使用,尚硅谷Vue系列教程学习笔记(2)

    尚硅谷Vue系列教程学习笔记(2) 参考课程:<尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通> 参考链接:https://www.bilibili.com/video/ ...

最新文章

  1. 看看40万程序猿怎么评论:对于程序员英语真的重要吗?
  2. 【python】数据结构与算法之二分查找
  3. anconda3安装虚拟环境
  4. php 写 mysql 事件_PHP日歷,包含來自MySQL數據庫的重復事件
  5. Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程
  6. Windows上C++使用共享内存进行进程间通讯
  7. 我看完大连理工研究生的遗书之后
  8. python 内存_一行Python解决内存问题
  9. java volatile修饰引用_关于volatile修饰引用类型的疑惑
  10. anaconda 安装在c盘_Tensorflow 2.1安装
  11. 8分钟答辩稿_教资面试!各科试讲逐字稿!背就稳了!
  12. 苹果怎么给软件加密码_用了2年苹果手机,才知道有这几个功能,钱没花冤枉,好用!!...
  13. 把实体 转为json 数据格式---jackson 的详细用法.
  14. 计算机应用的核心能力,应用能力为核心的高职计算机应用分析
  15. PowerDesigner注意事项
  16. 传智播客Java实现键盘数据的录入和if
  17. BigGAN高保真自然图像合成的大规模GAN训练
  18. 高数 | 反函数常见问题解决思路
  19. XSS及CSRF攻击防御
  20. 推荐系统之 FNN和DeepFM和NFM

热门文章

  1. [架构之路-139]-《软考-系统架构设计师》-企业信息化战略与实施:信息系统生命周期、企业信息化与电子商务、企业应用集成
  2. PTTools 安全性如何? VirScan 49款杀软强力测试
  3. 迅雷5处理千至万级url下载
  4. spring-boot-maven-plugin 报错,找不到
  5. ebay API开发系列:item_get-获得EBAY商品详情API 返回值说明
  6. 用python爬取伯乐在线的准备
  7. Preparing for Complete Database Recovery
  8. 插件化?好像也就那么回事
  9. 外贸独立站英文网站如何搭建
  10. Java Swing 打印条码界面