C++ 多态:概念,定义及实现以及原理

发布时间:2026/8/7 7:42:36

C++ 多态:概念,定义及实现以及原理
目录一.多态的概念1.1静多态1.2动多态重点二.多态的定义及实现2.1 多态的构成条件2.1.1 虚函数2.1.2 实现多态还有两个必须重要条件2.1.3 虚函数的重写/覆盖2.1.4 多态场景的一个选择题腾讯面试题2.1.5 虚函数重写的一些其他问题2.1.6override和final关键字2.1.7重载/重写/隐藏的对比面试考点一.多态的概念多态polymorphism的概念通俗来说就是多种形态。多态分为编译时多态静态多态和运行时多态动态多态这里我们重点讲运行时多态编译时多态静态多态和运行时多态动态多态。编译时多态静态多态主要就是我前面文章讲的函数重载和函数模板他们传不同类型的参数就可以调用不同的函数通过参数不同达到多种形态之所以叫编译时多态是因为他们实参传给形参的参数匹配是在编译时完成的我们把编译时一般归为静态运行时归为动态。运行时多态具体点就是去完成某个行为函数可以传不同的对象就会完成不同的行为就达到多种形态。比如买票这个行为当普通人买票时是全价买票学生买票时是优惠买票5折或75折)军人买票时是优先买票。再比如同样是动物叫的一个行为函数传猫对象过去就是”( ^ w ^ 喵“传狗对象过去就是”汪汪”。1.1静多态1. 核心定义在代码编译阶段编译器就已经确定好了要执行哪一个函数地址在编译期绑定也叫静态绑定、早绑定。 程序还没运行调用关系就已经敲定。2. 实现方式函数重载最典型 同一个作用域内函数名一致参数列表个数、类型、顺序不同编译器依靠参数区分调用哪个函数。运算符重载C3. 特点绑定时机编译期执行效率高运行时无额外开销不依赖继承、重写仅依靠函数签名区分。1.2动多态重点1. 核心定义编译阶段无法确定具体调用哪个函数必须等到程序运行起来根据当前对象的真实类型动态匹配对应的函数又称动态绑定、晚绑定。 也是面向对象里大家常说的狭义上的 “多态”。2. 必备条件C/Java 通用逻辑父子类存在继承关系父类声明虚函数C/ 允许重写Java子类重写父类的虚函数使用父类指针 / 引用指向子类对象。3. 特点绑定时机运行期需要继承 重写 虚函数支撑运行时有查表开销效率略低于静态多态同一个调用语句传入不同子类对象表现不同行为是多态最核心价值。对比项静态多态动态多态绑定时机编译期运行期别称早绑定、静态绑定晚绑定、动态绑定实现手段函数重载、运算符重载继承 虚函数重写、父类引用 / 指针是否需要继承不需要必须依靠继承体系运行开销几乎无开销虚表查找轻微运行开销典型场景同一类中同名不同参函数调用统一父类接口不同子类差异化实现二.多态的定义及实现2.1 多态的构成条件多态是一个继承关系的下的类对象去调用同一函数产生了不同的行为。比如Student继承了Person。Person对象买票全价Student对象优惠买票2.1.1 虚函数类成员函数前面加virtual修饰那么这个成员函数被称为虚函数。注意非成员函数不能加virtual修饰注意虚函数和虚继承虽然用的是同一个关键字virtual但是并没有什么关联关系对比维度虚函数 virtual 函数虚继承 virtual 继承修饰对象类的成员函数继承方式父类继承核心目标实现运行时多态动态绑定函数解决菱形多重继承的数据二义性、多份基类副本依赖场景单继承、普通继承都能用仅限多重菱形继承场景底层结构虚函数表 vtable 虚指针 vptr虚基表 虚基指针 vbptr作用对象控制成员函数调用逻辑调整对象内存布局、共享基类成员变量是否影响数据存储不改变成员变量布局大幅改变继承体系的内存布局典型问题解决父类指针精准调用子类重写方法d.A::x分不清是 B 里的 A 还是 C 里的 A内存开销对象增加 1 个 vptr 指针子类增加 vbptr 虚基指针2.1.2 实现多态还有两个必须重要条件被调用的函数必须是虚函数并且完成了虚函数重写/覆盖若父类没有用虚函数则不会构成多态调用的时候只会调用父类基类不开virtual编译时认准指针类型是Animal*固定调用父类方法基类开启virtual运行时查看指针指向的真实对象类型自动匹配子类重写的函数。func(a)→ Animal::talkfunc(c)→ 依然 Animal::talkfunc(d)→ 依然 Animal::talk必须是基类的指针或者引用调用虚函数2.1.3 虚函数的重写/覆盖虚函数的重写/覆盖派生类中有一个跟基类完全相同的虚函数即派生类虚函数与基类虚函数的返回值、函数名字、参数列表完全相同称派生类的虚函数重写了基类的虚函数注意在重写基类虚函数时派生类的虚函数在不加virtual关键字时虽然也可以构成重写因为C 规定基类中被virtual修饰的成员函数其 “虚函数” 的特性会被派生类继承。只要派生类定义的函数与基类虚函数的签名完全一致函数名、参数列表、const/volatile修饰符、返回类型都匹配那么这个派生类函数会自动成为虚函数无需显式加virtual关键字自然也能构成对基类虚函数的重写但是该种写法不是很规范不建议这样使用不过在考试选择题中经常会故意留这个坑让你判断是否构成多态主包之前在腾讯的笔试题中见过非常恶心只能说相关出题人用心险恶。2.1.4 多态场景的一个选择题腾讯面试题代码分析#include iostream using namespace std; // 父类基类A class A { public: // 虚函数func允许子类重写默认参数val1静态绑定的关键 virtual void func(int val 1) { cout A- val endl; } // 虚函数test内部调用func()B未重写此方法继承复用的关键 virtual void test() { func(); // 等价于 this-func()this是隐藏指针 } }; // 子类派生类Bpublic继承A继承的核心 class B : public A { public: // 重写overrideA的虚函数func函数签名和父类一致多态的前提 // 默认参数改为val0但默认参数不参与多态 void func(int val 0) { cout B- val endl; } // 关键B没有重写test() → 完全继承A的test()逻辑 }; int main() { B* p new B; // 静态类型B*动态类型B* p-test(); // 核心调用1重点分析 p-func(); // 核心调用2对比分析 delete p; // 补充避免内存泄漏 return 0; }2.1.5 虚函数重写的一些其他问题协变了解派生类重写基类虚函数时与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用派生类虚函数返回派生类对象的指针或引用时称为协变。协变的实际意义并不大所以了解一下即可但是若AB类没有继承关系就会有报错就是因为没有满足协变的要求如下图析构函数的重写笔试常见基类的析构函数为虚函数此时派生类析构函数只要定义无论是否加 virtual 关键字都与基类的析构函数构成重写虽然基类与派生类析构函数名字不同看起来不符合重写的规则实际上编译器对析构函数的名称做了特殊处理编译后析构函数的名称统一处理成 destructor 所以基类的析构函数加了 virtual 修饰派生类的析构函数就构成重写。下面结合代码说明一下某些情况下若析构函数不加 virtual 会出现的问题为什么基类中的析构函数建议设计为虚函数这个问题在面试中经常考察一定要结合样例才可以讲清楚总结基类和派生类的析构函数在编译器的作用下定义为相同的名称在main函数中如果用基类的指针或引用来指向基类或派生类对象时若调用delete则只会调用基类的析构不会调用派生类的析构所以我们要加上virtual来构成多态指向谁调用谁这里为什么调用两次~Person1.Person* p1 new Person; delete p1;真实对象就是Person虚析构触发自身析构函数仅执行~Person()→ 控制台第一行输出~Person()2.Person* p2 new Student; delete p2;因为基类Person析构加了virtual虚析构开启动态绑定完整的析构流程运行时识别真实类型是Student优先调用子类析构~Student()C 语法强制规则子类析构执行完毕后编译器会自动调用直接父类的析构函数不需要手动写代码 → 依次打印~Student()~Person()合在一起三行输出视觉上看到两次~Person()。2.1.6override和final关键字从上面可以看出C对虚函数重写的要求比较严格但是有些情况下由于疏忽比如函数名写错参数写错等导致无法构成重写而这种错误在编译期间是不会报出的只有在程序运行时没有得到预期结果才来debug灰得不偿失因此C11提供了 override 可以帮助用户检测是否重写。如果我们不想让派生类重写这个虚函数那么可以用final修饰一、override关键字1、作用显式声明当前函数意图重写父类的虚函数编译器强制校验 必须确实正确重写了基类的虚函数否则直接编译报错杜绝手误导致 “本该重写实际变成新建重载 / 隐藏函数”。2、使用规则只能写在子类重写虚函数的形参列表末尾只能修饰成员函数不能修饰普通函数、构造 / 析构、变量基类必须是virtual虚函数否则加override编译报错。这里我们可以看出不加override编译器不会报错当我们加上override后直接就会检查出来二.final关键字2.1.7重载/重写/隐藏的对比面试考点

相关新闻

Java SPI 从入门到源码精通:一篇彻底终结服务发现机制(附SPI坑点)

Java SPI 从入门到源码精通:一篇彻底终结服务发现机制(附SPI坑点)

2026/8/7 7:42:36

前言在复杂的软件系统中,模块间的解耦是架构设计的核心诉求。SPI(Service Provider Interface)正是 Java 官方为此提供的内置服务发现机制,允许接口定义方与实现方在编译期分离 —— 编译期依赖的是接口声明,而非具体实…

[开源]同城二手交易平台:Spring Boot + Vue 后端、Vue3 双前端,部署即用

[开源]同城二手交易平台:Spring Boot + Vue 后端、Vue3 双前端,部署即用

2026/8/7 7:42:36

从零手写「同城二手闲置平台」全套源码开源了:Spring Boot Vue3 前后端分离实战 大家好,我是专注于全栈项目实战的博主。今天给大家分享一个我完整开发并部署上线的开源项目——心享生活(xinxin-life)本地生活服务平台&#xff0…

STM32 FLASH闪存原理与实战:从基础操作到IAP应用

STM32 FLASH闪存原理与实战:从基础操作到IAP应用

2026/8/7 7:32:36

1. 项目概述:深入理解STM32的FLASH闪存 搞STM32开发,FLASH闪存绝对是一个绕不开的核心话题。它不仅是存放我们代码的“家”,更是实现产品功能升级、数据掉电保存等高级特性的关键硬件资源。很多朋友在项目初期可能只关心代码逻辑,…

家居MES专业厂家亲测:实践案例分享

家居MES专业厂家亲测:实践案例分享

2026/8/7 8:52:39

在泛家居制造领域,计划层与执行层之间的信息断层长期制约着企业效率。车间现场依赖纸质流转卡与人工台账,生产数据采集滞后,管理层获取的进度、质量信息普遍存在12-24小时延迟。数据表明,超过七成家居企业仍面临设备状态不可视、物…

面向太空光伏的AM0效率达27.49%的抗辐射宽带隙钙钛矿/硅叠层电池

面向太空光伏的AM0效率达27.49%的抗辐射宽带隙钙钛矿/硅叠层电池

2026/8/7 8:52:39

低轨卫星星座正在快速铺开,把太空光伏的门槛抬到了高效率、低成本、长寿命这三道硬杠上。III-V族电池性能好,可造价太高;硅电池便宜,但比功率和抗辐照都偏弱;单结钙钛矿在AM0下的效率又普遍上不去。钙钛矿/硅叠层原本被…

VRChat角色动画高效调试:VRC-Gesture-Manager编辑模式实时预览全解析

VRChat角色动画高效调试:VRC-Gesture-Manager编辑模式实时预览全解析

2026/8/7 8:52:39

1. 项目概述:为什么你需要一个高效的动画预览工具 如果你正在为VRChat制作角色,那么“动画”绝对是你投入时间最多、也最容易让人头疼的环节之一。无论是简单的表情切换,还是复杂的全身动作,都需要在Unity编辑器中反复测试、调整、…

Godot拖拽脚本失败:禁止图标原因与系统排查指南

Godot拖拽脚本失败:禁止图标原因与系统排查指南

2026/8/7 8:52:39

1. 问题现象与场景还原 最近在Godot引擎里折腾一个新项目,想给一个 Sprite2D 节点快速挂上一个自定义脚本,结果遇到了一个挺典型的“新手墙”问题:当我从文件系统面板里,把一个写好的 .gd 脚本文件拖拽到场景树(Sc…

MyBatis Plus复合主键处理方案全解析:从Model继承到QueryWrapper实战

MyBatis Plus复合主键处理方案全解析:从Model继承到QueryWrapper实战

2026/8/7 8:52:39

1. 复合主键的“坑”从何而来 最近在重构一个老项目的数据库层,把原来的MyBatis切换成了MyBatis Plus。本来想着能省不少事,毕竟那些基础的CRUD方法都不用自己写了。结果在实体类定义上就卡住了,因为表里用的是复合主键。MyBatis Plus默认的 …

应用部署常用脚本

应用部署常用脚本

2026/8/7 8:42:39

一、iptables 增加示例 iptables: -A INPUT -s 135.192.48.160/32 -p tcp -m multiport --dport 7800:7900 -j ACCEPT -A INPUT -s 135.192.14.231/32 -p tcp -m multiport --dport 22,1521 -j ACCEPT -A INPUT -s 135.192.14.232/32 -p tcp -m multiport --dport 22,1521 -j A…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/6 19:19:00

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/5 6:02:27

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/5 8:19:55

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

CAD图库管理:从文件归档到设计资产管理的效率革命

CAD图库管理:从文件归档到设计资产管理的效率革命

2026/8/7 0:02:15

你肯定遇到过这种情况:打开一个老项目,想找某个特定的图块——比如一个标准的门、一个特定的设备符号,或者一个公司logo。你记得它就在某个DWG文件里,或者曾经从某个同事那里拷来过。于是,你开始在一堆命名混乱的文件夹…

5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南

5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南

2026/8/7 0:02:15

5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer是一款功能强…

“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求

“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求

2026/8/7 0:02:15

“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求。而“软件测试”是质量控制的关键手段之一,属于QC范畴下的具体实践,其目标是发现缺陷、验证功能正确性、评估软件质量属…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/6 5:43:30

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/7 8:02:42

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/4 15:11:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…