前言

本章节主要针对于C++中的虚函数和多态做一个详细介绍。

虚函数

虚函数的长相其实很简单,在C++类型用virtual修饰的函数就是虚函数,如下代码:

虚函数对于本类的影响:存在虚函数类的内存会多四个字节,如下测试代码:

不过无论有多少个虚函数,内存只会多4个字节,因为所有虚函数都是用一个指针去存储的,即就是所谓的虚函数指针,虚函数指针(virtual function pointer)从本质上来说就只是一个指向函数的指针,与普通的指针并无区别。它指向用户所定义的虚函数,具体是在子类里的实现,当子类调用虚函数的时候,实际上是通过调用该虚函数指针从而找到接口。

抽象类

具有纯虚函数的类我们称之为抽象类,而纯虚函数就是没有函数体的函数,它也是一个特殊的虚函数,形态如下: virtual 函数返回值类型 函数名(参数)=0,抽象类不能创建对象,但是可以创建对象指针,如下代码:

抽象类一般充当ADT过程,也就是抽象数据类型使用,以及在设计模式中充当中间交互层。

虚函数和多态

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。其实对于多态的基本概念不需要背下来,只要你知道那个对象或者指针调用哪个成员基本上就行。

如一下代码:

1.正常情况下

就是本类对象初始化本类指针,本类对象或者之指针调用本类的成员,无论是父类还是子类就是就近原则。

2.非正常情况下

父类对象初始化子类对象,一般是不允许这样的操作的,这里不做概述,子类对象初始化父类指针,要看父类是否存在virtual,如果不存在,以指针类型为主,如果存在virtual就以对象为主。如一下测试代码:

关于多态的实现,不妨自行看看虚函数表的内容,我相信有很多博客文章都有讲解,这里不做详细概述。

虚析构函数

虚析构函数也就是使用virtual修饰的虚函数,为了能够防止子类对象初始化父类指针过程中的所引发的析构问题,我们常常会把父类的析构函数写成虚析构函数。如下测试代码:

如果你将父类的析构函数改为虚析构函数,子类和父类的析构函数将都可以被调用有兴趣的可以去试试哦。

希望对大家有帮助!

另外如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!

C语言C++编程学习:

点击领取C/C++编程学习资料​jq.qq.com

分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习软件分享:

编程学习视频分享:

子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...相关推荐

  1. Python OOP:继承、单继承、多继承、__mro__、子类重写父类同名属性和方法、子类调用父类同名属性和方法、多层继承、super()、私有(实例)属性和方法、获取修改私有属性值、私有类属性

    一.继承 Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法. 继承作用:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 在P ...

  2. java多态实现示例,以及子类重写父类方法调用父类方法

    多态 多态存在的三个必要条件:继承,重写,父类引用指向子类对象, 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则error:如果有,调用子类的同名方法. example: pack ...

  3. java 子类重写父类的方法应注意的问题

    若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:     重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写 ...

  4. php重载父类属性,子类重写父类属性的问题。。。。求解惑

    php 子类重写父类属性的问题 sal;}}class Manager extends Employer{protected $sal=5000;public function getParentSa ...

  5. 子类重写父类变量_为什么在子类中不重写超类的实例变量

    子类重写父类变量 当我们在父类和子类中创建一个具有相同名称的变量,并尝试使用持有子类对象的父类引用访问它时,我们会得到什么? 为了理解这一点,让我们考虑下面的示例,在该示例中,我们在Parent和Ch ...

  6. 关于子类重写父类方法的问题

    关于访问修饰符对重写父类方法的影响 结论 代码样例 子类 结论 子类重写父类的方法: 1.父类中私有方法不能被重写.因为父类私有方法子类可理解为被子类继承,但是不被子类可见,不可访问,当然就无法重写了 ...

  7. 子类重写父类构造器以及其他方法

    若父类重写了自身的构造器,并且还实现了自己的方法,那么,当子类继承父类后,重写自身的构造器和重写父类的其他方法时,搭配super()或者super.method()时候,会出现什么现象呢? 先看构造器 ...

  8. 子类重写父类方法,调用时会调用子类重写之后的方法

    1, 以下代码执行的结果显示是多少( )? public class Demo {class Super{ int flag=1;Super(){test();}void test(){System. ...

  9. 使用“override”声明的成员函数不能重写基类成员_C++日志(三十五)虚基类与其子类的构造函数...

    第三十四篇日志中提到,子类对象调用父类同名的函数时需要使用作用域标识符进行限定,这是在任何继承情况下都可以使用的普适方法. 问题引入: 考虑一种特殊的情况:子类全部或部分的基类(称为中间基类)同是继承 ...

最新文章

  1. UCSC hg19.ensembl.gtf
  2. mapper注解的主要作用_Mybatis中mapper的xml解析详解
  3. tor screenrec屏幕录制+_ScreenFlow for mac(屏幕录制软件) v8.2.4中文版
  4. 计算中英混合字符串的自己字节长度
  5. Windows系统中安装Python模块pip numpy matplotlib
  6. 重庆邮电计算机科学分数线,2020重庆邮电大学录取分数线已公布
  7. 定期存款可以提前取出来吗_定期存款、约定转存、自动转存和自己取出来转存有什么不同?...
  8. go语言导入git包_使用go module导入本地包的方法教程详解
  9. “狮”口逃生!长颈鹿勇斗狮群 4小时后脱身
  10. Dynamics Ax 2012中调用外部web服务
  11. 【PMP】工作分解结构WBS详解
  12. Android Studio 下载安装教程
  13. 网络安全等级保护云计算安全防护技术体系设计
  14. 宝峰对讲机编码写频工具
  15. Synonyms,一个开源的中文近义词工具包
  16. 复现KDL:使用Msnhnet实现串联机器人运动数值逆解(一)
  17. SQL Server Select Top语句
  18. 六度分离/HDOJ 1869
  19. 鬼泣模仿秀01——Unity3D实现类似鬼泣的蓄力攻击(C#)
  20. 如何在Microsoft Word中转录音频

热门文章

  1. 0728pm 控制器
  2. MySQL重置root用户密码的方法【亲测可用】
  3. 复杂的数据类型3 - C++快速入门09
  4. [分享]Windows Phone 7 For Dummies
  5. 弹性地基梁板实用计算_强夯地基承载力原理及测试方法
  6. struts2漏洞监测_CVE20190233: S2060 拒绝服务漏洞分析
  7. java为什么要初始化_JAVA中到底要怎么样初始化
  8. 微服务架构学习 之 什么是微服务
  9. curl 慢 不稳定_Node.js VM 不完全指北
  10. ckeditor5加字数_ckeditor字数限制