用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
大数据
›
数据仓库与分析
›
C++多态(实现部分)(一)
C++多态(实现部分)(一)
笑看天下无敌手
论坛元老
|
7 天前
|
显示全部楼层
|
阅读模式
楼主
主题
1956
|
帖子
1956
|
积分
5868
目录
1.多态的概念
1.1运行时多态
1.2 编译时多态
2.多态的定义以及实现
2.1 多态构成的条件
2.2 虚函数
2.3 虚函数的重写/覆盖
2.3.1 虚函数重写的两个例外
1.协变
2.析构函数的重写
2.4 override 和final关键字
2.5 重载/重写/隐蔽的对比
编辑
3. 抽象类 和纯虚函数
哈喽啊,各位博友们,本日咱们来学习C++多态,本日只讲实现部分,原理部分来日诰日会讲的。
1.多态的概念
1.1运行时多态
多态多态,顾名思义,多种状态,什么的多种状态?函数的多种状态。即当你传不同的对象时,固然调用的是同一个函数,但实在这个函数实行的举动是不同的。举个例子:买票的时间,有学生票,成人票。票就是要传的对象,而你的买票的地方是函数,固然都是买票的,但是对于学生,是学生票,对于成人,是成人票。(举动不同)以上说的是动态多态(运行时多态)。固然,多态还有静态多态(编译时多态)。
1.2 编译时多态
编译时 多态(静态多态)紧张就是我们前面讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的 函数,通过参数不同达到多种形态,之以是叫编译时多态,是由于他们实参传给形参的参数匹配是在 编译时完成的,我们把编译时⼀般归为静态,运行时归为动态。
来看一个代码图片吧。
没学多态之前是不是以为,这个输出语句调用的是同一个函数,但实在不是的,实在是调用了两个函数(由于变量的类型不同),这就是多态。
2.多态的定义以及实现
2.1 多态构成的条件
定义:是⼀个继承关系的下的类对象,去调用同⼀函数,产生了不同的举动。
条件:
1.必须是基类的指针或者引用调用的虚函数。
2.被调用的函数必须是虚函数,而且完成了虚函数重写/覆盖。
还有几点要注意一下:
要实现多态效果,第⼀,
必须是基类的指针或引用,由于只有基类的指针或引用才能既指向基类 对象又指向派生类对象;第二,派生类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派 生类之间才能有不同的函数,多态的不同形态效果才能达到。
观看上面的代码图片,可知:ptr是基类的指针或者引用吧,而且调用的还是虚函数吧,而且子类的虚函数还完成了重写。
注意:
调用虚函数的为父类的指针或者引用,你转达的实参是父类定义的对象就调用父类的函数,转达的实参是子类定义的对象就调用子类的函数,(这个很紧张)
在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,固然也可以构成重写(由于继承后基类的虚函数被继承下来了在派生类仍旧保持虚函数属性),
但是该种写法不是很规范,不发起如许使用。
2.2 虚函数
前面老说虚函数,这到底是什么呢?可以这么说,虚函数是为了多态才出现的,同样,重写也是为了多态才出现的。
类成员函数前面加virtual修饰,那么这个成员函数被称为虚函数。注意非成员函数不能加virtual修饰。
2.3 虚函数的重写/覆盖
虚函数的重写/覆盖:派生类中有⼀个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值 类型、函数名字、参数列表完全相同(这个指的是参数的类型,参数有无缺省值不影响)),称派生类的虚函数重写了基类的虚函数。
OK,来看一个题:
OK,咱们来分析一下这道题,先看main函数,p是指向B类的,以是可以以为p是不是属于B的。那么p调用test函数。但是这个test函数是A类里的呀,好,B继承了A,以是B类定义的指针也可以调用test函数。test函数里有个func函数。
那么这个func函数到底是A类的this指针调用的,还是B类的this指针调用的呢?是A类this指针调用的,由于継承不能说把this指针都给继承过去吧,那就太扯淡了。恰恰,回顾一下多态的条件,这里是不是构成了多态?是的。但是,这里是B类的指针调用的test函数,以是应该打印B类的虚函数,但是呢,B类虚函数前面没有virtual呀?别着急,咱们前面说的,如许也可以,由于此时是继承了
A类的函数名,返回类型,参数列表+B类的函数体
。以是说,这里的val是1呀,不是0.以是说答案是B->1。
2.3.1 虚函数重写的两个例外
1.协变
咱们知道,只有返回类型,函数名,参数列表相同的才可以叫做重写,但是协变不同,协变可以让返回值类型不同,也可以构成重写。但是需要注意几点:。即基类虚函数返回基类对象的指针或者引 用,派生类虚函数返回派生类对象的指针或者引用。
固然,这里不仅仅可以返回当前基类和子类的类型,还可以返回其他有继承关系的类和类型。
2.析构函数的重写
析构函数的重写,析构函数名同一处理成destructor。
这里本人也分为几个部分,先来看第一个部分:
咱们先来看堆上申请的空间里存放资源的析构。这里delete会调用析构函数对吧。那么先来看第一个图,假如不加上virtual,那么这俩析构函数就不构成多态,由于他俩都是A类的指针,以是说只会析构A类中的资源。但是,假如B类中有资源,那么你只析构A类的,不管B类的,是不是会造成资源泄漏的安全问题呀,以是,这种不构成多态的方法不可取。
那么第二张图就是构成了多态的情况,这种情况才是正确的情况。(即基类中的函数要设计成 虚函数,为了构成多态)。这种情况下,B类的析构函数是A类析构函数的重写(编译器对析 构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,以是基类的析构函数加了 virtual修饰,派⽣类的析构函数就构成重写。)那么就可以同一个函数实现两种不同的举动了。
这里的第二个new B前面写A*,单纯是为了演示第一种不是多态的情况。还有就是子类的析构函数,调用完子类的析构,会再自动的调用基类的析构函数。
第二个就是对于栈上开的空间,实行完直接析构了(需要遵守子类的先析构,父类的再析构)。而且,这里有人就会说了,这里没有virtual,析构函数的名字又相同,不是会构成成员函数隐蔽吗?不是只会调用子类的析构函数吗?不不,在这里,析构函数不遵守什么隐蔽规则,不然就资源泄漏了,完蛋了就。
2.4 override 和final关键字
从上⾯可以看出,C++对虚函数重写的要求⽐较严格,但是有些情况下由于疏忽,比如函数名写错参数 写错等导致无法构成重写,而这种错误在编译期间是不会报出的,只有在步伐运行时没有得到预期结 果才来debug会得不偿失,
因此C++11提供了override,可以资助用户检测是否重写。假如我们不想让 派生类重写这个虚函数,那么可以用final去修饰。
这个没什么好说的,就是对于一些极度情况发生的查抄。
2.5 重载/重写/隐蔽的对比
3. 抽象类 和纯虚函数
在虚函数的后⾯写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义由于要被 派生类重写,但是语法上可以实现),只要声明即可。包罗纯虚函数的类叫做抽象类,抽象类不能实例 化出对象,
假如派生类继承后不重写纯虚函数,那么派生类也是抽象类
。
纯虚函数某种程度上欺压了 派生类重写虚函数,由于不重写实例化不出对象。
可以看出来,
派生类中对虚函数进行了重写
,那么这个派生类实例化对象就不会报错了。
虚函数就是为了多态而出现的,以是不必要时没必须要写虚函数。
好啦,本篇就讲到这,剩下的比力难的原理部分以及扩展部分,来日诰日讲。
本篇完..........
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
笑看天下无敌手
论坛元老
这个人很懒什么都没写!
楼主热帖
mysql精简单机版,免登录,可复制,不 ...
计算机视觉-OpenCV图像金字塔 ...
Java如何使用流式编程的方式访问url呢 ...
【毕业季】-职场10年大咖有话想说 ...
Gitee教程实战(企业级) 包含详细的出 ...
一个工作薄中快速新建多个数据表 ...
使用ansible部署服务到k8s
使用 Kubeadm 部署 Kubernetes(K8S) 安 ...
什么是真正的HTAP?(一)背景篇 ...
【牛客刷题-SQL进阶挑战】NO1.增删改操 ...
标签云
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
虚拟化与私有云
Mysql
登录参与点评抽奖加入IT实名职场社区
下次自动登录
忘记密码?点此找回!
登陆
新用户注册
用其它账号登录:
关闭
快速回复
返回顶部
返回列表