子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...
前言
本章节主要针对于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++的虚函数和多态,你真的了解吗?...相关推荐
- Python OOP:继承、单继承、多继承、__mro__、子类重写父类同名属性和方法、子类调用父类同名属性和方法、多层继承、super()、私有(实例)属性和方法、获取修改私有属性值、私有类属性
一.继承 Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法. 继承作用:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 在P ...
- java多态实现示例,以及子类重写父类方法调用父类方法
多态 多态存在的三个必要条件:继承,重写,父类引用指向子类对象, 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则error:如果有,调用子类的同名方法. example: pack ...
- java 子类重写父类的方法应注意的问题
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一: 重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写 ...
- php重载父类属性,子类重写父类属性的问题。。。。求解惑
php 子类重写父类属性的问题 sal;}}class Manager extends Employer{protected $sal=5000;public function getParentSa ...
- 子类重写父类变量_为什么在子类中不重写超类的实例变量
子类重写父类变量 当我们在父类和子类中创建一个具有相同名称的变量,并尝试使用持有子类对象的父类引用访问它时,我们会得到什么? 为了理解这一点,让我们考虑下面的示例,在该示例中,我们在Parent和Ch ...
- 关于子类重写父类方法的问题
关于访问修饰符对重写父类方法的影响 结论 代码样例 子类 结论 子类重写父类的方法: 1.父类中私有方法不能被重写.因为父类私有方法子类可理解为被子类继承,但是不被子类可见,不可访问,当然就无法重写了 ...
- 子类重写父类构造器以及其他方法
若父类重写了自身的构造器,并且还实现了自己的方法,那么,当子类继承父类后,重写自身的构造器和重写父类的其他方法时,搭配super()或者super.method()时候,会出现什么现象呢? 先看构造器 ...
- 子类重写父类方法,调用时会调用子类重写之后的方法
1, 以下代码执行的结果显示是多少( )? public class Demo {class Super{ int flag=1;Super(){test();}void test(){System. ...
- 使用“override”声明的成员函数不能重写基类成员_C++日志(三十五)虚基类与其子类的构造函数...
第三十四篇日志中提到,子类对象调用父类同名的函数时需要使用作用域标识符进行限定,这是在任何继承情况下都可以使用的普适方法. 问题引入: 考虑一种特殊的情况:子类全部或部分的基类(称为中间基类)同是继承 ...
最新文章
- UCSC hg19.ensembl.gtf
- mapper注解的主要作用_Mybatis中mapper的xml解析详解
- tor screenrec屏幕录制+_ScreenFlow for mac(屏幕录制软件) v8.2.4中文版
- 计算中英混合字符串的自己字节长度
- Windows系统中安装Python模块pip numpy matplotlib
- 重庆邮电计算机科学分数线,2020重庆邮电大学录取分数线已公布
- 定期存款可以提前取出来吗_定期存款、约定转存、自动转存和自己取出来转存有什么不同?...
- go语言导入git包_使用go module导入本地包的方法教程详解
- “狮”口逃生!长颈鹿勇斗狮群 4小时后脱身
- Dynamics Ax 2012中调用外部web服务
- 【PMP】工作分解结构WBS详解
- Android Studio 下载安装教程
- 网络安全等级保护云计算安全防护技术体系设计
- 宝峰对讲机编码写频工具
- Synonyms,一个开源的中文近义词工具包
- 复现KDL:使用Msnhnet实现串联机器人运动数值逆解(一)
- SQL Server Select Top语句
- 六度分离/HDOJ 1869
- 鬼泣模仿秀01——Unity3D实现类似鬼泣的蓄力攻击(C#)
- 如何在Microsoft Word中转录音频
热门文章
- 0728pm 控制器
- MySQL重置root用户密码的方法【亲测可用】
- 复杂的数据类型3 - C++快速入门09
- [分享]Windows Phone 7 For Dummies
- 弹性地基梁板实用计算_强夯地基承载力原理及测试方法
- struts2漏洞监测_CVE20190233: S2060 拒绝服务漏洞分析
- java为什么要初始化_JAVA中到底要怎么样初始化
- 微服务架构学习 之 什么是微服务
- curl 慢 不稳定_Node.js VM 不完全指北
- ckeditor5加字数_ckeditor字数限制