news 2026/4/16 20:04:50

C++进阶:(二)多态的深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++进阶:(二)多态的深度解析

一、多态的概念:什么是多态?

1.1 多态的通俗理解

多态(polymorphism),字面意思是 “多种形态”。在编程语境中,指的是同一个行为(函数调用),作用于不同的对象,会产生不同的执行结果。生活中处处可见多态的影子:

  • 买票行为:普通人买票全价、学生买票打折、军人买票优先,同样是 “买票” 操作,不同身份的人(不同对象)执行结果不同;
  • 动物叫声:猫叫是 “喵”,狗叫是 “汪汪”,同样是 “发声” 行为,不同动物(不同对象)表现形式不同;
  • 交通工具行驶:汽车在路上跑,飞机在天上飞,轮船在水里游,同样是 “移动” 行为,不同交通工具(不同对象)实现方式不同。

这种 “一个接口,多种实现” 的思想,正是多态的核心价值 —— 它屏蔽了不同对象之间的差异,让开发者可以通过统一的方式调用不同对象的方法,极大简化了代码逻辑。

1.2 多态的分类

C++ 中的多态分为两大类:编译时多态(静态多态)运行时多态(动态多态),二者的核心区别在于 “行为确定的时机” 不同。

1.2.1 编译时多态(静态多态)

编译时多态是指在编译阶段就确定了函数的调用关系,行为结果在编译时已经明确。它的实现方式主要有两种:

  • 函数重载:同一作用域内,函数名相同但参数列表(参数类型、个数、顺序)不同的函数,编译器会根据实参类型匹配对应的函数;
  • 函数模板:通过模板参数自动适配不同类型,编译时会为每种使用的类型生成对应的函数实例。

示例:函数重载实现静态多态

代码语言:javascript

AI代码解释

#include <iostream> using namespace std; // 函数重载:参数类型不同 int Add(int a, int b) { cout << "int Add: "; return a + b; } double Add(double a, double b) { cout << "double Add: "; return a + b; } // 函数重载:参数个数不同 int Add(int a, int b, int c) { cout << "int Add(3 params): "; return a + b + c; } int main() { cout << Add(1, 2) << endl; // 调用int Add(int, int) cout << Add(1.5, 2.5) << endl; // 调用double Add(double, double) cout << Add(1, 2, 3) << endl; // 调用int Add(int, int, int) return 0; }

运行结果

代码语言:javascript

AI代码解释

int Add: 3 double Add: 4 int Add(3 params): 6

静态多态的特点是效率高(编译时确定调用地址,无运行时开销),但灵活性差(必须在编译时明确所有可能的行为,无法适应运行时动态变化的场景)。

1.2.2 运行时多态(动态多态)

运行时多态是指在程序运行阶段才确定函数的调用关系,行为结果取决于运行时的对象类型。它是 C++ 多态的核心,也是本文重点讲解的内容。

示例:运行时多态的直观体现

代码语言:javascript

AI代码解释

#include <iostream> using namespace std; // 基类:人 class Person { public: // 虚函数:买票 virtual void BuyTicket() { cout << "普通人买票:全价" << endl; } }; // 派生类:学生(继承自Person) class Student : public Person { public: // 重写基类虚函数 virtual void BuyTicket() { cout << "学生买票:半价(硬座)/75折(高铁二等座)" << endl; } }; // 派生类:军人(继承自Person) class Soldier : public Person { public: // 重写基类虚函数 virtual void BuyTicket() { cout << "军人买票:优先购票" << endl; } }; // 统一接口:调用买票行为 void DoBuyTicket(Person& people) { people.BuyTicket(); // 同一调用语句,不同对象表现不同 } int main() { Person p; Student s; Soldier sol; DoBuyTicket(p); // 输出:普通人买票:全价 DoBuyTicket(s); // 输出:学生买票:半价(硬座)/75折(高铁二等座) DoBuyTicket(sol); // 输出:军人买票:优先购票 return 0; }

运行结果

代码语言:javascript

AI代码解释

普通人买票:全价 学生买票:半价(硬座)/75折(高铁二等座) 军人买票:优先购票

在这个示例中,DoBuyTicket函数接收Person类型的引用,但传入不同的派生类对象时,会执行对应的BuyTicket方法。这种 “同一接口,多种实现” 的效果,正是运行时多态的核心体现。它的特点是灵活性高(支持动态扩展,新增派生类无需修改原有接口代码),但有轻微运行时开销(需要在运行时查找函数地址)。

二、多态的定义及实现:三大核心条件

想要实现 C++ 运行时多态,必须满足三个核心条件,缺一不可。很多开发者在使用多态时出现问题,本质上都是没有完全满足这三个条件。

2.1 核心条件一:继承关系

多态必须建立在类的继承体系之上,即存在基类(父类)和派生类(子类)的继承关系。派生类通过继承基类,获得基类的接口(虚函数),并可以根据自身需求重写该接口。

需要注意

  • 支持单一继承(一个派生类继承一个基类)和多重继承(一个派生类继承多个基类),但多重继承可能导致虚函数表复杂,需要谨慎使用;
  • 派生类必须是公有继承(public inheritance),才能保证基类的指针 / 引用可以访问派生类的虚函数(私有继承或保护继承会限制访问权限)。

2.2 核心条件二:虚函数与重写
2.2.1 虚函数的定义

虚函数是多态的“开关”,在基类的成员函数前加上virtual关键字,该函数就成为虚函数。

语法格式

代码语言:javascript

AI代码解释

class 基类名 { public: virtual 返回值类型 函数名(参数列表) { // 函数实现 } };

注意事项

  • virtual关键字仅需在基类声明时添加,派生类重写时可加可不加,但建议加上,能够提高代码可读性;
  • 非成员函数(全局函数)、静态成员函数(static修饰)、构造函数不能声明为虚函数;
  • 析构函数可以(且建议)声明为虚函数,这是面试高频考点,后续会详细讲解。
2.2.2 虚函数的重写(覆盖)

虚函数的重写(也叫覆盖)是指:派生类中有一个与基类虚函数完全相同的函数,即满足 “三同” 原则:

  1. 函数名相同;
  2. 参数列表(参数类型、个数、顺序)相同;
  3. 返回值类型相同(协变情况除外,后续讲解)。


www.dongchedi.com/article/7595302533728911934
www.dongchedi.com/article/7595302732916277822
www.dongchedi.com/article/7595300345145164313
www.dongchedi.com/article/7595287730565710361
www.dongchedi.com/article/7595287469617529368
www.dongchedi.com/article/7595289256520663576
www.dongchedi.com/article/7595287092394000920
www.dongchedi.com/article/7595286612611957273
www.dongchedi.com/article/7595285133738410521
www.dongchedi.com/article/7595285905729487384
www.dongchedi.com/article/7595287514580435481
www.dongchedi.com/article/7595285072006382105
www.dongchedi.com/article/7595285719334502936
www.dongchedi.com/article/7595285631619007000
www.dongchedi.com/article/7595277509785453081
www.dongchedi.com/article/7595276630432760345
www.dongchedi.com/article/7595275735409967640
www.dongchedi.com/article/7595277089067549246
www.dongchedi.com/article/7595276413155295769
www.dongchedi.com/article/7595276373905195544
www.dongchedi.com/article/7595274144955499033
www.dongchedi.com/article/7595274423667048984
www.dongchedi.com/article/7595275907217195545
www.dongchedi.com/article/7595274913787953689
www.dongchedi.com/article/7595274806057337368
www.dongchedi.com/article/7595274833727406617
www.dongchedi.com/article/7595255011878208062
www.dongchedi.com/article/7595255232834159166
www.dongchedi.com/article/7595244636982379033
www.dongchedi.com/article/7595246619336000062
www.dongchedi.com/article/7595245102663352894
www.dongchedi.com/article/7595246113737982526
www.dongchedi.com/article/7595238963515146814
www.dongchedi.com/article/7595238605032292888
www.dongchedi.com/article/7595237840809198105
www.dongchedi.com/article/7595237829975212569
www.dongchedi.com/article/7595237024668877336
www.dongchedi.com/article/7594914712018600510
www.dongchedi.com/article/7594913283375907352
www.dongchedi.com/article/7594914016129106456
www.dongchedi.com/article/7594914424213766718
www.dongchedi.com/article/7594913083894891033
www.dongchedi.com/article/7594913119710069310
www.dongchedi.com/article/7594912459706696254
www.dongchedi.com/article/7594911633613390360
www.dongchedi.com/article/7594909036307595800
www.dongchedi.com/article/7594910057444786750
www.dongchedi.com/article/7594909893274927641
www.dongchedi.com/article/7594909974816588350
www.dongchedi.com/article/7594909035217404441
www.dongchedi.com/article/7594908551181615678
www.dongchedi.com/article/7594906883010855486
www.dongchedi.com/article/7594907513641058878
www.dongchedi.com/article/7594905549272285720
www.dongchedi.com/article/7594906861996884505
www.dongchedi.com/article/7594906134906421785
www.dongchedi.com/article/7594905869373096472
www.dongchedi.com/article/7594904114086560281
www.dongchedi.com/article/7594903301414650392
www.dongchedi.com/article/7594901235942228542
www.dongchedi.com/article/7594901805579452953
www.dongchedi.com/article/7594900315275657752
www.dongchedi.com/article/7594899458794799641
www.dongchedi.com/article/7594900266315645465
www.dongchedi.com/article/7594900151853236798
www.dongchedi.com/article/7594898846111580697
www.dongchedi.com/article/7594899021756776984


www.dongchedi.com/article/7594897166766965272
www.dongchedi.com/article/7594897310665245246
www.dongchedi.com/article/7594897192310407705
www.dongchedi.com/article/7594897631617794585
www.dongchedi.com/article/7594896580080435737
www.dongchedi.com/article/7594895704896684568
www.dongchedi.com/article/7594897374330503705
www.dongchedi.com/article/7594895618720449048
www.dongchedi.com/article/7594896034183397912
www.dongchedi.com/article/7594896087656694334

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:01:49

Unity游戏本地化完全指南:XUnity自动翻译器5大核心技巧

Unity游戏本地化完全指南&#xff1a;XUnity自动翻译器5大核心技巧 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的生涩对话和复杂菜单而烦恼吗&#xff1f;&#x1f3ae; 语言障碍是否…

作者头像 李华
网站建设 2026/4/16 13:01:27

3个窗口管理痛点,一个AlwaysOnTop解决方案

3个窗口管理痛点&#xff0c;一个AlwaysOnTop解决方案 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是不是也经常遇到这样的场景&#xff1f;正在对照文档编写代码&#xff…

作者头像 李华
网站建设 2026/4/16 14:49:14

视频嗅探神器猫抓:轻松下载网页视频的终极指南

视频嗅探神器猫抓&#xff1a;轻松下载网页视频的终极指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法保存网页视频而烦恼吗&#xff1f;猫抓这款专业的视频嗅探工具正是你需要的解决方…

作者头像 李华
网站建设 2026/4/16 3:39:44

SAM 3实战案例:社交媒体内容自动标记系统构建

SAM 3实战案例&#xff1a;社交媒体内容自动标记系统构建 1. 背景与需求分析 随着社交媒体平台内容的爆炸式增长&#xff0c;图像和视频成为用户表达的主要形式。然而&#xff0c;海量非结构化视觉数据给内容管理、推荐系统和广告投放带来了巨大挑战。传统的人工标注方式效率…

作者头像 李华
网站建设 2026/4/16 3:23:09

网易云音乐NCM加密文件终极解密指南:让音乐重获自由

网易云音乐NCM加密文件终极解密指南&#xff1a;让音乐重获自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他设备播放而困扰吗&#xff1f;这款专业的NCM解密工具将彻底解决你的烦恼…

作者头像 李华
网站建设 2026/4/16 13:01:53

终极i茅台自动预约系统:新手必看完整部署指南

终极i茅台自动预约系统&#xff1a;新手必看完整部署指南 【免费下载链接】campus-imaotai i茅台app自动预约&#xff0c;每日自动预约&#xff0c;支持docker一键部署 项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai 还在为i茅台预约烦恼吗&#xf…

作者头像 李华