以下内容源于慕课网的学习整理,如有侵权,请告知删除。

1、多态的定义

  • 简单理解,就是对于同一条命令,不同对象会做出不同的操作。
  • 相同对象收到不同消息,或者不同对象收到相同消息时,产生不同的动作。

2、多态的分类

(1)静态多态(早绑定)

  • 如函数重载,在编译阶段,(根据传参情况)就已经知道要执行哪个函数。

(2)动态多态(晚绑定)

a、虚函数

多态具体到语法上是

  • 父类和多个子类有同名函数;
  • 定义了父类指针并指向了子类对象,然后通过父类指针,调用子类中的同名函数,而非父类中的同名函数。
  • 动态多态,即父类调用子类的实现方式。

实现多态,需要将父类中的同名函数定义为虚函数

  • 虚函数,即在成员函数前(如析构函数前、普通成员函数前)添加关键字virtual。

下面不是动态多态,因为main中调用的都是父类中的函数

     

     

为了实现调用子类中的同名函数,需要在父类的同名函数前添加关键字virtual,(建议在子类的同名函数前也添加virtual,但不是必须的)

b、虚析构函数

多态中存在的问题是内存泄漏问题,解决方法是虚析构函数。

  • 使用父类指针,去销毁子类对象时,会出现内存泄漏的问题。
  • 因为delet p(p是父类指针)时,执行的是父类的析构函数;
  • 而我们希望执行的是子类的析构函数。
  • 解决这个问题的方法是,在父类的析构函数前添加virtual,即虚析构函数。
  • 实际上,执行完子类的虚析构函数就会执行父类的析构函数。

c、virtual在函数中的使用限制

  • 普通函数不能是虚函数,必须是类的成员函数;
  • 静态成员函数不能是虚函数,如 virtual stact int getCount() 是错误的;
  • 内联函数不能是虚函数;
  • 构造函数不能是虚函数。

3、虚函数和虚析构函数的实现原理

(1)首先知道函数指针这个概念。

(2)虚函数表

  • 当父类有虚函数时,并且实例化一个父类对象时,会有一个虚函数表指针,指向了一个虚函数表。
  • 通过虚函数表得到虚函数指针,从而得到虚函数的入口地址。

   

  • 子类也有一个虚函数表,子类的虚函数表的首地址,一般和父类虚函数表的首地址不一样;
  • 假如子类中没有定义和父类同名的虚函数(如下),那么子类从父类中继承了虚函数,因此子类的虚函数表中的虚函数指针指向同一个虚函数入口。

  • 假如子类中定义了和父类同名的虚函数(如下),那么子类的虚函数将覆盖父类的虚函数。

(3)虚析构函数的实现原理

  • 前提(已知),执行完子类的虚析构函数就会自动执行父类的析构函数。
  • 子类中有虚析构函数(如果父类的析构函数用virtual修饰的话,则子类的虚构函数无论是否用virtual修饰,都是虚析构函数);
  • 父类指针通过子类的虚函数表指针,得到虚析构函数的入口地址,执行完子类的虚析构函数后,会自动执行父类的析构函数。

(4)证明虚函数表指针的存在?

(5)细节

  • 在c++中,多态的实现是通过虚函数表实现的;
  • 每个类只有一份虚函数表,所有该类的对象共用同一张虚函数表;
  • 两张函数表中的函数指针可能指向同一个函数。

c++远征之多态篇——虚函数及其实现原理相关推荐

  1. C++学习之第十一天-多态、虚函数

    一.选择题 1.下列关于动态联编的描述中,错误的是(D). A.动态联编是以虚函数为基础 B.动态联编是运行时确定所调用的函数代码的 C.动态联编调用函数操作是指向对象的指针或对象引用 D.动态联编是 ...

  2. C++初步之核心编程篇五:多态与虚函数类

    C++初步之核心编程篇五:多态与虚函数类 文章目录 C++初步之核心编程篇五:多态与虚函数类 1. 多态的概要 2. 多态案例一-计算器类 3. 纯虚函数和抽象类 4. 多态案例二-制作饮品 5. 虚 ...

  3. 慕课网-C++远征之多态篇(中)-学习笔记

    c++远征之多态篇 纯虚函数 & 抽象类 例子: class Shape { public:virtual double calcArea()//虚函数{return 0;}virtual d ...

  4. C++中类的多态与虚函数的使用(转)

    C++中类的多态与虚函数的使用 http://www.cnblogs.com/fangyukuan/archive/2010/05/30/1747449.html 类的多态特性是支持面向对象的语言最主 ...

  5. C++中类的多态与虚函数的使用

    C++中类的多态与虚函数的使用 http://www.cnblogs.com/fangyukuan/archive/2010/05/30/1747449.html 类的多态特性是支持面向对象的语言最主 ...

  6. 复习笔记(五)——C++多态和虚函数

    静态绑定与动态绑定 静态绑定: -编译时就能确定一条函数调用语句要调用的函数 -在程序编译时多态性体现在函数和运算符的重载上 动态绑定: -运行时才能确定函数调用语句调用的函数 -程序运行时的多态性通 ...

  7. 【阿里面试】C++多态和虚函数

    文章目录 一.C++的面试常考点 二.阿里真题 2.1 现在假设有一个编译好的C++程序,编译没有错误,但是运行时报错,报错如下:你正在调用一个纯虚函数(Pure virtual function c ...

  8. C++ 多态、虚函数、虚方法

    子类在继承了父类的方法后,可以对父类已有的方法给出新的实现版本,这个动作称之为方法重写(override).通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本,当我们调用这个经过子类重写 ...

  9. PKU C++程序设计实习 学习笔记3 多态与虚函数

    第六章 多态与虚函数 6.1 多态和虚函数的基本概念 引言 多态是面向对象程序设计里面非常重要的这个机制.它能很有效的提高程序的可扩充性. 有些程序设计语言有被对象继承的概念,但是没有多态的概念,那这 ...

最新文章

  1. spring 多数据源动态切换
  2. 吞吐量-Corda的故事
  3. Python3回文相关算法小结
  4. 探索PCIe 3.0峰值性能,长江存储推新消费级固态硬盘致态TiPlus5000
  5. 专业上需要加强的地方
  6. Supervisord管理
  7. Hibernate VS iBATIS
  8. AHT20温湿度传感器STM32-I2C驱动,替代DHT11/DHT12/AM2320/SHT20/SHT30,IIC代码兼容AHT10/15-MEMS温湿度传感器
  9. c语言在线翻译器,【C语言】【window】--在线翻译器.doc
  10. 分享11个web前端开发实战项目案例+源码
  11. Unable to start activity ComponentInfo,请教如何解决?
  12. ice中间件 java_ICE中间件介绍以及demo
  13. 专升本第七部分 计算机网络基础与网页设计
  14. MySQL ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
  15. win10 cortana搜索没有任何结果,只是一片空白的解决方案
  16. The Thirteenth Of Word-Day
  17. EasyExcel:读取Excel数据到List集合中
  18. linux系统 网站木马后门Webshell查杀工具源码
  19. 014-无条件跳转指令jmp+
  20. Hive知识点总结(简明版)

热门文章

  1. mongodb 多表查询
  2. 有状态的bean和无状态的bean的区别
  3. 网页常用动态效果--悬浮广告
  4. [BZOJ 3236] [Ahoi2013] 作业 [BZOJ 3809] 【莫队(+分块)】
  5. PictureBox
  6. MVC日期格式化,后台使用Newtonsoft.Json序列化日期,前端使用”f”格式化日期
  7. JQuery 加载 CSS、JS 文件
  8. 2-05 使用固态存储SSD或PCIe卡
  9. 前端测试利器--Browser-Sync启动命令
  10. SQL Server -- SQLserver 存储过程执行错误记录到表