news 2026/5/1 13:38:10

C++多态精髓:三大特性完美收官

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++多态精髓:三大特性完美收官

一、上期回顾

继承语法、三种继承权限、父子构造析构顺序、子类调用父类构造、同名隐藏。封装、继承学完,今天拿下多态,OOP 三大特性彻底收官。


二、什么是多态

一句话:一个接口,多种实现

  • 父类引用 / 指针,指向子类对象
  • 调用同一个函数,执行子类自己的版本

价值:

  1. 程序扩展性极强
  2. 符合开闭原则:新增子类不用改原有代码
  3. 框架、驱动、嵌入式业务层大量用到

三、多态实现条件(面试必背三条)

  1. 必须有继承关系
  2. 父类中有虚函数 virtual
  3. 父类指针 / 父类引用指向子类对象

满足三条,触发动态绑定,实现多态。


四、虚函数与普通函数区别

普通成员函数

静态绑定:编译阶段就确定调用哪个类的函数,看指针类型。

虚函数 virtual

动态绑定:运行时看对象真实类型,调用子类重写版本。


五、多态完整示例代码

#include <iostream> using namespace std; // 父类 class Animal { public: // 虚函数 virtual void speak() { cout << "动物发出声音" << endl; } }; // 子类Dog class Dog : public Animal { public: // 重写虚函数 void speak() { cout << "小狗汪汪叫" << endl; } }; // 子类Cat class Cat : public Animal { public: void speak() { cout << "小猫喵喵叫" << endl; } }; int main() { Animal* p; p = new Dog(); p->speak(); // 执行Dog版本 p = new Cat(); p->speak(); // 执行Cat版本 return 0; }

运行结果:

plaintext

小狗汪汪叫 小猫喵喵叫

六、重写(覆盖)规则

子类重写父类虚函数要求:

  • 函数名、参数列表、返回值完全一致
  • 不加 virtual 也可以,继承自带虚属性
  • C++11 推荐加override显式标识,防止写错:
void speak() override { cout << "小猫喵喵叫" << endl; }

七、虚析构函数(大坑必考)

父类指针 delete 子类对象时:

  • 若析构不是虚函数,只调用父类析构,子类析构不执行→ 内存泄漏

正确写法:父类析构加 virtual

class Animal { public: virtual ~Animal() { cout << "父类析构" << endl; } };

口诀:有继承多态,析构必写虚


八、纯虚函数 & 抽象类

纯虚函数格式

virtual void func() = 0;

抽象类特点

  1. 包含纯虚函数的类叫抽象类
  2. 不能实例化对象
  3. 只能被继承,子类必须全部重写纯虚函数才能实例化
  4. 用来做接口规范

示例:

class Shape { public: // 纯虚函数 virtual void getArea() = 0; }; // 必须重写才能创建对象 class Circle : public Shape { public: void getArea() override { cout << "圆形面积计算" << endl; } };

九、今日核心总结

  1. 多态三要素:继承 + 虚函数 + 父类指针 / 引用
  2. 虚函数实现动态绑定,普通函数静态绑定
  3. 多态:一个接口,多种实现,扩展性拉满
  4. 多态场景下,析构函数必须加 virtual
  5. 纯虚函数构成抽象类,只能做基类、定接口规范

十、课后练习

  1. 写父类 Shape 抽象类,纯虚函数 getArea ()
  2. 写 Rectangle、Circle 子类重写求面积
  3. 用父类指针指向不同子类,感受多态效果
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 13:36:44

支付宝沙箱验签踩坑记:Hutool JSONObject格式化引发的invalid-signature错误

支付宝沙箱验签陷阱&#xff1a;Hutool JSON格式化引发的签名失效深度解析 当Java开发者使用支付宝沙箱环境进行支付对接时&#xff0c;经常会遇到一个令人头疼的问题——invalid-signature验签错误。这个问题看似简单&#xff0c;实则隐藏着工具库使用中的微妙陷阱。本文将从一…

作者头像 李华
网站建设 2026/5/1 13:35:04

青龙面板定时任务进阶:除了阿里云盘签到,还能这样玩?

青龙面板定时任务进阶&#xff1a;解锁自动化管理的无限可能 青龙面板作为一款强大的定时任务管理平台&#xff0c;早已超越了简单的脚本执行工具范畴。当大多数用户还停留在使用它进行阿里云盘签到这类基础操作时&#xff0c;进阶玩家已经将其打造成个人自动化生态系统的核心枢…

作者头像 李华
网站建设 2026/5/1 13:34:40

CSAPP DataLab通关秘籍:手把手教你用位运算实现C语言三目运算符

CSAPP DataLab通关秘籍&#xff1a;用位运算实现三目运算符的底层艺术 1. 理解三目运算符的本质 在C语言中&#xff0c;三目运算符x ? y : z是一个简洁的条件选择表达式&#xff0c;它根据条件x的真假决定返回y还是z。从高级语言的视角看&#xff0c;这似乎是一个简单的语法糖…

作者头像 李华
网站建设 2026/5/1 13:34:01

如何轻松找回遗忘的压缩包密码:ArchivePasswordTestTool终极指南

如何轻松找回遗忘的压缩包密码&#xff1a;ArchivePasswordTestTool终极指南 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾经遇到…

作者头像 李华
网站建设 2026/5/1 13:32:39

你不是执行力差,你只是“代码没编译过”

《心学攻略:王阳明给现代人的“人生重构”系统》 11/24 第11讲 | 知行合一:治好你的“知识瘫痪症” 老马今天想聊个特别扎心的话题。 你手机里收藏了多少篇“干货文章”?那些标题写着“深度好文”“看完顿悟”“建议收藏”的东西,你点进去看了,觉得“哇,说得太对了”,…

作者头像 李华
网站建设 2026/5/1 13:32:39

微信防撤回终极指南:3步搞定新版微信消息防撤回

微信防撤回终极指南&#xff1a;3步搞定新版微信消息防撤回 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/GitH…

作者头像 李华