C++笔记-多态(包含虚函数,纯虚函数和虚函数表等)
1.1C的第一个程序1.多态的概念多态(polymorphism)的概念:通俗来说就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)这里我们重点讲运行时多态编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们前面讲的函数重载和函数模板他们传不同类型的参数就可以调用不同的函数通过参数不同达到多种形态之所以叫编译时多态是因为他们实参传给形参的参数匹配是在编译时完成的我们把编译时一般归为静态运行时归为动态。 运行时多态具体点就是去完成某个行为(函数)可以传不同的对象就会完成不同的行为就达到多种形态。比如买票这个行为当普通人买票时是全价买票;学生买票时是优惠买票(5折或75折);军人买票时是优先买票。再比如同样是动物叫的一个行为(函数)传猫对象过去就是”(^w^)喵“传狗对象过去就是汪汪。2.多态的定义及实现2.1多态的构成条件多态是一个继承关系下的类对象去调用同一函数产生了不同的行为。比如Student继承了Person。Person对象买票全价Student对象优惠买票。2.1.1实现多态还有两个必须重要条件1.必须是基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数并且完成了虚函数重写说明:要实现多态效果第一必须是基类的指针或引用因为只有基类的指针或引用才能既指向基类对象又指向派生类对象;第二派生类必须对基类的虚函数完成重写/覆盖重写或者覆盖了基类和派生类之间才能有不同的函数多态的不同形态效果才能达到。这里提到了新名词虚函数我先演示一下多态的基本使用下面再详细讲虚函数。这里就是实现了多态我们可以看到虽然func的参数是Person类型的引用但是结果却调用了子类中的虚函数。里面的原因就如func中所写的那样跟ptr没关系和ptr所指向的对象有关。指针和引用差不多这里我就不演示了。注意这两个条件缺一不可这里就是不符合第一个条件就没有构成多态此时就和ptr有关了调用BuyTicket函数就看的是调用的类型而ptr类型是Person故只会调用Person中的函数。2.1.2虚函数类成员函数前面加virtual修饰那么这个成员函数就称为虚函数。注意非成员函数不能加virtual修饰。上面例子中的BuyTicket函数就是虚函数。2.1.3虚函数的重写/覆盖虚函数的重写/覆盖:派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数类型完全相同)称派生类的虚函数重写了基类的虚函数。 注意:在重写基类虚函数时派生类的虚函数在不加virtual关键字时虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性)但是该种写法不是很规范不建议这样使用。上面子类中的BuyTicket就是对父类的重写这里注意重写/覆盖的是函数的实现部分就是括号里面的内容。接着上面不符合第二个条件这里就不符合第二个条件了此时的BuyTicket函数就不是虚函数构不成多态故还是调用父类的函数。这种也是不构成多态的virtual只能子类隐藏父类是不能隐藏的。讲到这我们来看一道题问以下程序输出结果是什么A.A-0 B.B-1 C.A-1 D.B-0 E.编译出错 F.以上都不正确大家可以思考一下这个问题的答案。答案选择B这里可能很多人都不理解这里面有俩个坑。第一个就判断这里到底是不是多态我们可以看到此时创建了一个子类对象通过子类对象去调用test函数。这里要注意继承并不是把父类的函数拷贝到子类在调用时先在子类查找找不到才会去父类去查找。而这个坑的难点就是test函数中的this指针到底是A*呢还是B*呢遵循上面的原则我们在子类没有找到test函数接着去父类找找到了既然要调用父类的test函数那this指针自然而然就是A*那既然是基类的指针来调用虚函数那么就构成多态。来到第二个坑这也是为什么这道题选B的原因。既然上面构成多态了那么指针指向的对象是子类对象就该调用子类里面的func函数正常来说应该是B-0但是我们上面写了虚函数的重载/覆盖只是针对函数实现部分所以只是把实现部分的func给重写了那么既然只针对实现部分那么参数部分的val就不会发生变化就还是默认的缺省值1.这里很多人出错就是被这个缺省值给误导了所以我们要牢记虚函数重载/覆盖只针对函数实现部分。有人会有疑惑那缺省值不是不一样吗怎么会构成虚函数重写呢 这个问题我们要看上面虚函数重写的概念是函数名返回值类型和参数类型皆相同里面是不包含缺省值的缺省值不同不影响。2.1.4虚函数重写的一些其他问题

相关新闻

单词速记-关联之道:从millionaire(百万富翁)谈起

单词速记-关联之道:从millionaire(百万富翁)谈起

一、后缀-aire:从millionaire聊起 英语单词 millionaire,意为“百万富翁”: millionaire n.百万富翁;大富豪 这是一个派生词,基词或词干是million,million是一个数词,正好表“百万”之数&#…

2026/7/7 20:25:20 阅读更多 →
SpringMVC的工作流程

SpringMVC的工作流程

1.工作流程(1)用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet拦截。 (2)DispatcherServlet拦截到请求后,会调用HandlerMapping(处理器映射器)。 …

2026/7/7 9:13:35 阅读更多 →
C++ 定长内存池,让内存分配快到飞起!

C++ 定长内存池,让内存分配快到飞起!

本篇摘要 在本篇将介绍C定长内存池的概念及实现问题,引入内存池技术,通过实现一个简单的定长内存池部分,体会奥妙所在,进而为之后实现整体的内存池做铺垫! 一 📖高并发内存池概述 ⾼并发的内存池&#x…

2026/7/7 2:15:28 阅读更多 →

最新新闻

Barlow字体:如何用一款字体解决现代设计的三大核心挑战?

Barlow字体:如何用一款字体解决现代设计的三大核心挑战?

Barlow字体:如何用一款字体解决现代设计的三大核心挑战? 【免费下载链接】barlow Barlow: a straight-sided sans-serif superfamily 项目地址: https://gitcode.com/gh_mirrors/ba/barlow 在数字时代,设计师和开发者面临着一个看似简…

2026/7/8 5:36:43 阅读更多 →
2026年上海改灯性价比分析:如何挑选高性价比改灯方案

2026年上海改灯性价比分析:如何挑选高性价比改灯方案

一、开头:技术痛点/趋势引入2026年,随着汽车保有量的持续增长,改灯领域面临新的挑战。在技术交流群里,经常能看到有人询问改灯到底该怎么做选型。不少车主反馈,改灯后出现灯光效果不佳、容易损坏以及年审不通过等问题。…

2026/7/8 5:36:43 阅读更多 →
【LLM】第四章:GPT2讲解+古诗词生成案例

【LLM】第四章:GPT2讲解+古诗词生成案例

【LLM】第四章:GPT2讲解古诗词生成案例 GPT(Generative Pre-trained Transformer)是一个生成模型,也是第一个系统性提出预训练微调范式的语言模型。 其核心思想是通过大规模无监督语料进行生成式语言建模预训练,即训练模型根据前面上下文预…

2026/7/8 5:34:42 阅读更多 →
电销系统不一定贵,但要看这几点

电销系统不一定贵,但要看这几点

电销总被封号?选对系统比盲目加人更重要 每天打几十上百通电话,却频频遭遇封号、客户不接、空号浪费时间——这是无数电销团队的真实困境。与其不断换卡、换人,不如从源头解决线路稳定性与外呼效率问题。本文将直接为你梳理几套经过实战验证的…

2026/7/8 5:30:41 阅读更多 →
【玩转 AtomCode】隐藏高级功能挖掘:MCP、Hooks、Skills、Plugin 完全指南

【玩转 AtomCode】隐藏高级功能挖掘:MCP、Hooks、Skills、Plugin 完全指南

【玩转 AtomCode】隐藏高级功能挖掘:MCP、Hooks、Skills、Plugin 完全指南「码动四季」征文活动参赛作品 大多数人只用 AtomCode 写代码,但它的真正强大之处在于扩展生态。本文在华为云服务器上实操 MCP 协议接入、Hooks 生命周期钩子、Skills 技能系统、…

2026/7/8 5:28:40 阅读更多 →
Obsidian:英雄联盟Wad文件编辑的终极免费工具

Obsidian:英雄联盟Wad文件编辑的终极免费工具

Obsidian:英雄联盟Wad文件编辑的终极免费工具 【免费下载链接】Obsidian Wad archive editor for League of Legends 项目地址: https://gitcode.com/gh_mirrors/obsidian2/Obsidian 如果你正在寻找一款英雄联盟Wad编辑器来探索游戏资源,那么Obsi…

2026/7/8 5:24:40 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻