news 2026/7/15 6:18:13

C++ 继承不只是“抄代码”!三种继承方式,权限大不同!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 继承不只是“抄代码”!三种继承方式,权限大不同!

C++ 继承不只是“抄代码”!三种继承方式,权限大不同!

你以为class Son : public Base中的public只是个摆设?
错!它决定了子类能“看到”父类多少内容,甚至影响整个类的设计!

大家好!在上一篇我们讲了继承如何减少重复代码,今天我们要深入一步:
C++ 的继承,其实有三种“姿势”——公共继承、保护继承、私有继承
它们看起来只差一个关键字,但对成员访问权限的影响却天差地别

别担心,我们用一个清晰的例子 + 表格对比,带你彻底搞懂!


📌 先看基础:父类的三种成员权限

假设我们有一个基类Base

class Base { public: int m_A; // 公共成员 protected: int m_B; // 保护成员 private: int m_C; // 私有成员(子类永远不可见) };
  • public:任何地方都能访问

  • protected类内部 + 派生类可访问,外部不可

  • private仅本类内部可访问,子类也看不到!

⚠️ 注意:无论哪种继承方式,父类的 private 成员,子类都不可直接访问


🔑 三种继承方式,到底有什么区别?

C++ 的继承语法是:

class 子类 : 继承方式 父类

其中继承方式有三种:

继承方式

语法示例

对父类成员权限的影响

公共继承

: public Base

权限保持不变

保护继承

: protected Base

父类的public→ 子类中变为protected

私有继承

: private Base

父类的public/protected→ 子类中全变private

下面我们逐个来看!


✅ 1. 公共继承(public inheritance)

class Son1 : public Base { public: void func() { m_A; // ✅ 可访问(仍是 public) m_B; // ✅ 可访问(仍是 protected) // m_C; // ❌ 不可访问(private) } }; void test() { Son1 s; s.m_A; // ✅ 外部可以访问(因为是 public) }

💡公共继承 = “是…的一种”关系
比如 “学生 是 人 的一种”,所以通常用public,这也是最常用的继承方式!


🔒 2. 保护继承(protected inheritance)

class Son2 : protected Base { public: void func() { m_A; // ✅ 可访问,但在 Son2 中已变成 protected m_B; // ✅ 可访问(仍是 protected) // m_C; // ❌ 不可访问 } }; void test() { Son2 s; // s.m_A; // ❌ 编译错误!m_A 在 Son2 中是 protected,外部不能访问 }

💡保护继承 = “内部复用,但不对外暴露”
适用于:你想复用父类功能,但不希望用户通过子类对象直接访问父类接口。


🗝️ 3. 私有继承(private inheritance)

class Son3 : private Base { public: void func() { m_A; // ✅ 可访问,但在 Son3 中变为 private m_B; // ✅ 可访问,也变为 private // m_C; // ❌ 不可访问 } }; // 再派生一层 class GrandSon3 :public Son3 { public: void func() { // m_A; // ❌ 无法访问!因为 Son3 是私有继承,GrandSon3 看不到 Base 的成员 // m_B; // ❌ 同上 } }; void test() { Son3 s; // s.m_A; // ❌ 外部无法访问(已是 private) }

💡私有继承 ≈ “组合”的替代写法
它表示“用到了父类的功能,但不是‘是一种’的关系”。
比如:Car私有继承Engine—— 车“包含”引擎,但车不是引擎!


📊 一张表总结所有情况

父类成员

public 继承

protected 继承

private 继承

public

成员

→ 子类中仍为public

→ 变为protected

→ 变为private

protected

成员

→ 仍为protected

→ 仍为protected

→ 变为private

private

成员

→ 子类不可见

→ 子类不可见

→ 子类不可见

记住口诀
“公继承保原样,保继承降一级,私继承全私藏!”


🎯 实际开发中怎么选?

  • 90% 场景用public继承:当你想表达 “A 是 B 的一种”(如 Dog 是 Animal)

  • 极少用protected/private继承:多用于底层库设计或特殊封装需求

  • 如果只是想“复用代码”而非“建立类型关系”,优先考虑组合(has-a)而非私有继承


🔚 小结

C++ 的继承不只是“复制粘贴”,更是一种权限控制机制
三种继承方式,本质是在回答一个问题:

“我愿意让别人通过子类看到父类的哪些部分?”

掌握它们,你才能写出既安全又灵活的面向对象代码!


📬思考题
如果Base中有一个public函数void show()
private继承下,能否在子类的成员函数中调用它?
外部能否通过子类对象调用?欢迎留言讨论!


💡提示:你提供的示例非常经典,清晰展示了三种继承对成员可见性的影响。建议在学习时动手运行一遍,加深理解!

如果你觉得这篇推文有帮助,欢迎点赞、转发给正在啃 C++ 的小伙伴!下期我们聊聊“继承中的

构造与析构顺序”,敬请期待~ 😊

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

Bootstrap4 Jumbotron

Bootstrap4 Jumbotron Bootstrap 是一个广泛使用的开源前端框架,它为开发者提供了一个快速构建响应式、移动优先的网页和应用程序的平台。在 Bootstrap 中,Jumbotron 是一个非常重要的组件,它允许开发者创建一个吸引眼球的展示区域,用于突出显示重要信息或宣传内容。本文将…

作者头像 李华
网站建设 2026/7/8 4:29:29

ARM Cortex-M调试利器:ST-Link仿真器快速理解手册

ARM Cortex-M调试利器:深入理解ST-Link仿真器的工程实践你有没有遇到过这样的场景?程序下载后运行几秒就“卡死”,串口毫无输出,看门狗反复复位。翻遍代码也没找到问题所在,只能靠加打印、删模块一步步“盲调”——这正…

作者头像 李华
网站建设 2026/7/8 4:29:03

Qwen3-VL电影分镜生成:文本描述转可视化镜头序列

Qwen3-VL电影分镜生成:从文本描述到可视化镜头序列 在影视创作的世界里,一个精准而富有张力的分镜表往往决定了一部作品的视觉基调。传统流程中,导演与美术指导需反复沟通、手绘草图、调整构图,整个过程耗时数天甚至数周。如今&am…

作者头像 李华
网站建设 2026/7/14 4:48:55

Qwen3-VL工厂巡检机器人:设备状态视觉监控与报警

Qwen3-VL工厂巡检机器人:设备状态视觉监控与报警 在现代化工厂的轰鸣声中,一台巡检机器人正沿着预设轨道缓缓前行。它的“眼睛”——高清摄像头,持续扫描着配电柜、压力表和管道接口。突然,画面中某个指针微微偏移出绿色区域&…

作者头像 李华
网站建设 2026/7/14 23:24:45

Qwen3-VL解析ACM Digital Library引用格式

Qwen3-VL解析ACM Digital Library引用格式 在学术研究日益依赖数字资源的今天,研究人员每天都要面对海量文献的整理与引用工作。尤其是计算机科学领域,ACM Digital Library作为核心数据库之一,其引用格式规范而多样——从会议论文到期刊文章&…

作者头像 李华
网站建设 2026/7/14 23:25:04

接口性能优化全攻略:异步、缓存、批处理与空间换时间

核心思想:异步、缓存、批处理、空间换时间 目标:提高接口响应速度、系统吞吐量和稳定性 一、核心思想与对应优化方案 核心思想 常用优化方案 典型场景 实现方式 效果 异步 异步调用 耗时操作(发送短信/邮件、日志、数据同步) 线程池、消息队列(RabbitMQ/Kafka/RocketMQ)、…

作者头像 李华