尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C++的3种继承方式

C++的3种继承方式
📅 发布时间:2026/6/19 4:30:11

C++的3种继承方式

在 C++ 中,继承方式(public、protected、private)决定了基类成员在派生类中的访问权限,以及派生类对象对基类成员的访问权限。正确选择继承方式是实现封装、复用和多态的关键。以下是三种继承方式的适用场景及详细说明:

一、核心规则:继承方式对访问权限的影响

先明确基类成员(public/protected/private)在派生类中的权限变化(核心依据 C++ 访问控制规则):

基类成员权限 public 继承 protected 继承 private 继承
public public protected private
protected protected protected private
private 不可访问 不可访问 不可访问

关键结论:

  • 继承方式仅影响基类的 public 和 protected 成员(private 成员无论哪种继承都无法被派生类访问);
  • 继承方式的核心作用是控制“基类接口对派生类外部的可见性”。

二、public 继承(最常用)

适用场景:表示“is-a”关系(派生类是基类的一种)

当派生类本质上是基类的一个特例,需要继承基类的接口(public 成员)并可能重写基类的虚函数时,使用 public 继承。这是最符合面向对象设计思想的继承方式。

典型例子:

  • Student 继承 Person(学生是人的一种);
  • Circle 继承 Shape(圆形是形状的一种);
  • TCPConnection 继承 Connection(TCP 连接是连接的一种)。

特点与好处:

  1. 接口复用:派生类自动拥有基类的 public 接口,外部可通过派生类对象直接访问(例如 Student 对象可调用 Person::getName());
  2. 实现多态:基类的虚函数可在派生类中重写,通过基类指针/引用调用时会触发动态绑定(例如 Shape* s = new Circle(); s->draw(); 调用 Circle::draw());
  3. 兼容性:派生类对象可隐式转换为基类对象(或基类指针/引用),符合 “is-a” 的逻辑(例如 Person p = Student(); 合法)。

使用建议:

  • 只要是“派生类是基类的一种”的场景,优先使用 public 继承;
  • 基类中需要被派生类重写的函数,必须声明为 virtual(确保多态生效);
  • 基类析构函数应声明为 virtual(避免通过基类指针删除派生类对象时内存泄漏)。

三、protected 继承(极少使用)

适用场景:继承基类的“实现细节”,且允许子类进一步复用

当派生类需要复用基类的 public/protected 成员作为自己的实现细节,但不希望这些成员被外部直接访问,同时希望派生类的子类(孙子类)也能复用这些成员时,使用 protected 继承。

典型例子:

  • 一个游戏中的 PlayerCharacter 继承 CharacterStats(角色属性类),CharacterStats 的 public 方法(如 getHealth()、setHealth())在 PlayerCharacter 中变为 protected,这样外部无法直接修改玩家血量,但 PlayerCharacter 的子类(如 Warrior、Mage)可以访问这些方法来实现技能效果(例如 Warrior::takeDamage() 调用 setHealth())。

特点与好处:

  1. 实现复用:派生类可直接访问基类的 public/protected 成员,无需通过 public 接口暴露;
  2. 子类可继承:基类成员在派生类中为 protected,因此派生类的子类(孙子类)也能访问这些成员,支持多层继承复用;
  3. 接口隐藏:外部无法通过派生类对象访问基类的任何成员(包括原 public 成员),避免接口污染。

使用注意:

  • protected 继承不表示“is-a”关系(外部无法将派生类对象视为基类对象);
  • 由于使用场景狭窄,实际开发中极少使用(通常可通过 private 继承或组合替代)。

四、private 继承(实现继承)

适用场景:仅复用基类的“实现细节”,不暴露任何基类接口

当派生类仅需要复用基类的代码实现(如基类的某个算法、工具函数),但不希望外部知道其继承关系,也不允许派生类的子类访问基类成员时,使用 private 继承。核心是“继承实现,隐藏接口”。

典型例子:

  • String 类继承 Array<char>(假设 Array 提供动态数组管理):Array 的 public 方法(如 resize()、getSize())在 String 中变为 private,String 对外提供自己的接口(如 length()、append()),避免外部直接操作底层数组;
  • 一个 Logger 类继承 FileWriter(文件写入类):FileWriter 的 write() 方法在 Logger 中为 private,Logger 对外提供 log() 方法,封装日志格式和写入逻辑。

特点与好处:

  1. 实现复用:派生类可直接调用基类的 public/protected 成员,无需重复编写代码;
  2. 接口完全隐藏:外部无法通过派生类对象访问基类的任何成员,派生类的子类也无法访问基类成员(基类成员在派生类中为 private);
  3. 避免多态歧义:由于基类成员被隐藏,派生类可自由定义与基类同名的成员,无需担心多态冲突。

与组合(has-a)的对比:

  • 组合(如 class String { private: Array<char> arr; };)也能实现“复用实现、隐藏接口”,且比 private 继承更灵活(可动态替换成员对象);
  • 当基类有虚函数,且派生类需要重写这些虚函数来改变实现时,private 继承更合适(组合无法重写基类虚函数)。

使用建议:

  • 优先用组合替代 private 继承(组合更符合“低耦合”设计原则);
  • 仅当需要重写基类虚函数且不希望暴露基类接口时,才考虑 private 继承。

五、总结

  1. 优先 public 继承:当派生类是基类的一种(is-a),需要继承接口并支持多态时【仅 public 继承可以实现多态】;
  2. 谨慎使用 protected 继承:仅当需要复用基类实现,且允许子类进一步复用该实现时(极少场景);
  3. 尽量用组合替代 private 继承:仅当需要重写基类虚函数且隐藏接口时,才用 private 继承;
  4. 记住核心原则:继承的核心是“复用”,但 public 继承侧重“接口复用+多态”,protected/private 继承侧重“实现复用+接口隐藏”。

相关新闻

  • 1081. Rational Sum (20)
  • 1067. Sort with Swap(0) (25)
  • 1050. String Subtraction (20)

最新新闻

  • 2026全域外卖平台红黑榜真实横评,避坑攻略口碑实力双保障 - mypinpai
  • K2.5开源模型:面向生产级Agent系统的状态感知架构
  • 馨风尚包装源头工厂公司介绍与实力测评,零套路口碑之选 - myqiye
  • 交流电转直流电的电源电路
  • Python 开发者进阶 AI,除了语法还要补哪些课
  • 微前端赋能电力存量系统升级|Vue2渐进式迁移Vue3、双栈兼容架构、业务零停机方案、电网全场景落地实战、全套工程代码复现

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号