公有继承与私有继承的区别
公有继承与私有继承的区别一、核心概念对比特性公有继承public私有继承private关系描述is-a是一个has-a有一个/ 用…来实现接口继承保留基类接口隐藏基类接口类型兼容派生类可转换为基类不能转换代码复用方式白盒复用内部可见黑盒复用内部隐藏访问权限基类 public → 派生类 public基类所有成员 → 派生类 private二、公有继承is-a 关系2.1 定义与特点classEngine{public:voidStart(){cout引擎启动endl;}};classCar:publicEngine{// 公有继承Car is-a Engine// Car 拥有 Engine 的所有接口};intmain(){Car car;car.Start();// 可以直接调用基类方法return0;}2.2 类型兼容性classPerson{};classStudent:publicPerson{};// 公有继承intmain(){Student s;Person*ps;// 派生类指针可转换为基类指针Personrs;// 派生类引用可转换为基类引用return0;}三、私有继承has-a 关系3.1 定义与特点classEngine{private:intcylinderNum;public:Engine(intn4):cylinderNum(n){}voidEnStart(){cout引擎启动endl;}};// 私有继承Car has-a Engine用 Engine 来实现 CarclassCar:privateEngine{public:Car(intn4):Engine(n){}voidStart(){Engine::EnStart();// 内部可以调用基类方法}};intmain(){Car car;car.Start();// 通过 Car 的公有接口调用// car.EnStart(); // 错误外部不能直接访问基类方法return0;}3.2 私有继承的内存布局私有继承的内存布局 Car 对象 ----------------------------------------------------------- Engine 部分基类子对象 cylinderNum (4B) EnStart() 方法 --------------------------- Car 部分派生类新增 可能有其他成员 --------------------------- 特点基类部分存在但外部不可见四、公有继承 与 私有继承 与 组合4.1 三种方式对比方式关系接口可见性类型兼容耦合度公有继承is-a完全可见支持较高私有继承has-a完全隐藏不支持较低组合has-a完全隐藏不支持最低4.2 组合示例推荐替代私有继承// 使用组合替代私有继承classEngine{public:voidEnStart(){cout引擎启动endl;}};classCar{private:Engine engine;// 组合Car has-a Enginepublic:voidStart(){engine.EnStart();// 委托给成员对象}};intmain(){Car car;car.Start();// 通过 Car 接口调用// car.EnStart(); // 不能直接访问return0;}4.3 何时使用私有继承场景推荐方式原因需要访问基类的 protected 成员私有继承组合无法访问 protected 成员需要重写基类的虚函数私有继承可以重写虚函数实现定制不需要上述特性组合更简单耦合度更低// 需要重写虚函数时使用私有继承classBase{public:virtualvoidfunc(){coutBaseendl;}};classDerived:privateBase{public:voidfunc()override{coutDerivedendl;}// 重写虚函数voidcall(){func();}};五、多重继承与组合的选择5.1 不推荐的多重继承classDoor{public:voidOpen(){cout开门endl;}};classEngine{public:voidStart(){cout启动引擎endl;}};// 不推荐汽车有多个属性不应该用多重继承classCar:privateEngine,privateDoor{public:voidStart(){Engine::Start();}voidOpen(){Door::Open();}};5.2 推荐的组合方式// 推荐使用组合将多个属性作为成员classCar{private:Engine engine;// 引擎Door door;// 门Wheel wheels[4];// 车轮public:voidStart(){engine.Start();}voidOpenDoor(){door.Open();}};六、继承与静态成员6.1 场景一基类和派生类共享同一个静态成员classPerson{public:staticintnum;// 静态成员只有一份};intPerson::num0;classStudent:publicPerson{public:Student(){coutCreate Student: numendl;}~Student(){coutDestroy Student: num--endl;}};classEmployee:publicPerson{public:Employee(){coutCreate Employee: numendl;}~Employee(){coutDestroy Employee: num--endl;}};intmain(){Student s1,s2;Employee e1,e2;// 所有对象共享同一个 numcouts1.numendl;// 地址相同coute1.numendl;// 地址相同return0;}内存布局共享静态成员的内存布局 ------------------------------------------------------ 数据区.data Person::num 4 所有 Person、Student、Employee 对象共享 ------------------------------------------------------ Student 对象1 Student 对象2 Employee 对象1 Person 部分 Person 部分 Person 部分 (无 num) (无 num) (无 num)6.2 场景二基类和派生类各自有同名静态成员classPerson{public:staticintnum;// Person 的静态成员};intPerson::num0;classStudent:publicPerson{public:staticintnum;// Student 自己的静态成员隐藏了 Person::num};intStudent::num0;classEmployee:publicPerson{public:staticintnum;// Employee 自己的静态成员};intEmployee::num0;intmain(){Student s1,s2;Employee e1,e2;// 三个静态成员地址不同couts1.numendl;// Student::num 的地址coute1.numendl;// Employee::num 的地址coutPerson::numendl;// Person::num 的地址// 访问方式Student::num10;// 访问 Student 的静态成员Person::num100;// 访问 Person 的静态成员return0;}内存布局各自独立静态成员的内存布局 数据区.data -------------------------------------- Person::num 100 -------------------------------------- Student::num 10 -------------------------------------- Employee::num 0 -------------------------------------- 注意三个静态成员相互独立地址不同七、完整示例代码#includeiostreamusingnamespacestd;// 公有继承示例 classAnimal{public:voideat(){cout动物进食endl;}};classDog:publicAnimal{// 公有继承public:voidbark(){cout汪汪叫endl;}};// 私有继承示例 classEngine{private:intpower;public:Engine(intp100):power(p){}voidstart(){cout引擎启动功率powerendl;}};classCar:privateEngine{// 私有继承public:Car(intp100):Engine(p){}voiddrive(){start();// 内部可以调用基类方法cout汽车行驶endl;}};// 组合示例推荐 classComputer{private:CPU cpu;// 组合Memory mem;// 组合public:voidrun(){cpu.process();mem.load();}};// 静态成员测试 classBase{public:staticintcount;};intBase::count0;classDerived1:publicBase{public:Derived1(){count;}};classDerived2:publicBase{public:Derived2(){count;}};classDerived3:publicBase{public:staticintcount;// 隐藏基类静态成员Derived3(){count;}};intDerived3::count0;intmain(){cout 公有继承 endl;Dog dog;dog.eat();// 继承自 Animaldog.bark();// Dog 自己的方法cout\n 私有继承 endl;Carcar(150);car.drive();// car.start(); // 外部无法访问cout\n 共享静态成员 endl;Derived1 d1,d2;Derived2 d3;coutBase::count Base::countendl;// 3cout\n 独立静态成员 endl;Derived3 d4,d5;coutDerived3::count Derived3::countendl;// 2coutBase::count Base::countendl;// 3不变return0;}八、选择需求场景推荐方式原因表达is-a关系公有继承符合面向对象设计需要重写虚函数公有/私有继承私有继承也可重写只需要使用功能组合更低耦合需要访问 protected 成员继承公有或私有组合无法访问表达has-a关系组合优先更灵活更安全需要多态公有继承支持基类指针/引用九、建议优先使用组合而非私有继承除非需要访问 protected 成员或重写虚函数公有继承用于表达真实的is-a关系避免多重继承优先使用组合静态成员在继承中的行为要清楚同名会隐藏不同名则共享私有继承是实现继承不应暴露给用户

相关新闻

Apache DolphinScheduler 数据源架构深度解析:现代数据编排平台的多源集成与性能优化

Apache DolphinScheduler 数据源架构深度解析:现代数据编排平台的多源集成与性能优化

Apache DolphinScheduler 数据源架构深度解析:现代数据编排平台的多源集成与性能优化 【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code 项目地址…

2026/7/12 23:34:56阅读更多 →
QEMU 8.2.2 Windows 部署 UOS ARM 虚拟机:3步脚本配置与 SSH 端口 2222 映射

QEMU 8.2.2 Windows 部署 UOS ARM 虚拟机:3步脚本配置与 SSH 端口 2222 映射

QEMU 8.2.2 Windows 部署 UOS ARM 虚拟机:3步脚本配置与 SSH 端口 2222 映射对于需要在 Windows 环境下进行 ARM 架构开发或测试的技术人员来说,搭建一个稳定可靠的 ARM 虚拟机环境是必不可少的。本文将介绍如何使用 QEMU 8.2.2 在 Windows 系统上快速部…

2026/7/12 23:34:56阅读更多 →
3大核心技术突破:如何让AMD GPU高效运行kohya_ss模型训练

3大核心技术突破:如何让AMD GPU高效运行kohya_ss模型训练

3大核心技术突破:如何让AMD GPU高效运行kohya_ss模型训练 【免费下载链接】kohya_ss 项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss kohya_ss作为当前最受欢迎的AI模型训练工具,已实现对AMD GPU的完整技术栈支持,通过R…

2026/7/12 23:34:56阅读更多 →
后端技术栈全面梳理:主流框架与选型建议

后端技术栈全面梳理:主流框架与选型建议

别听那些“全栈工程师”的忽悠,真正决定一个系统生死、一家公司技术负债的,从来都是后端技术栈的选型。前端换框架如同换衣服,后端换语言和基础设施,则无异于给飞行中的飞机换引擎。今天我们就把后端技术栈里那些关键、热门、甚至…

2026/7/13 0:45:07阅读更多 →
3D打印壳体设计对比:AutoCAD vs. 中望3D 2024 在STL导出上的3点差异

3D打印壳体设计对比:AutoCAD vs. 中望3D 2024 在STL导出上的3点差异

3D打印壳体设计深度对比:AutoCAD与中望3D 2024的STL导出实战解析引言在机械设计领域,壳体结构的3D建模与打印已成为产品原型开发的关键环节。AutoCAD作为行业老牌CAD软件,与国产新锐中望3D 2024在壳体设计和STL导出流程上存在显著差异。本文将…

2026/7/13 0:45:07阅读更多 →
从单轮问答到全流程自治:ChatGPT多步骤任务构建的3个分水岭阶段(仅0.3%高级用户掌握的SOP)

从单轮问答到全流程自治:ChatGPT多步骤任务构建的3个分水岭阶段(仅0.3%高级用户掌握的SOP)

更多请点击: https://kaifayun.com 第一章:从单轮问答到全流程自治:ChatGPT多步骤任务构建的演进本质 交互范式的根本跃迁 早期大语言模型以单轮问答为核心能力,用户输入一个问题,模型返回一个静态响应。而现代ChatG…

2026/7/13 0:45:07阅读更多 →
ChatGPT长程任务失效真相:上下文溢出、状态漂移、意图衰减——3类致命故障的实时拦截方案

ChatGPT长程任务失效真相:上下文溢出、状态漂移、意图衰减——3类致命故障的实时拦截方案

更多请点击: https://intelliparadigm.com 第一章:ChatGPT长程任务失效真相:上下文溢出、状态漂移、意图衰减——3类致命故障的实时拦截方案 当ChatGPT处理超过8–10轮交互的复杂任务(如多阶段代码调试、跨文档合同比对、渐进式需…

2026/7/13 0:45:07阅读更多 →
影刀RPA 医药行业自动化:药品信息采集与价格监控

影刀RPA 医药行业自动化:药品信息采集与价格监控

影刀RPA 医药行业自动化:药品信息采集与价格监控作者:林焱一、什么情况用影刀处理医药数据 医药行业的信息管理痛点很明显:国家医保局每季度更新医保目录,各省市的药品挂网价格频繁调整,药企的市场部门需要实时掌握竞品…

2026/7/13 0:45:07阅读更多 →
Java 大厂面试高频题:别再只会 new 了!Java 创建对象竟然有这么多种方式

Java 大厂面试高频题:别再只会 new 了!Java 创建对象竟然有这么多种方式

在学习 Java 时,我们最先接触的对象创建方式通常是: Person person new Person();因此,很多初学者会认为 Java 创建对象只能使用 new。 实际上,Java 中常见的对象创建方式不止一种。除了直接使用 new,还可以通过反射、…

2026/7/13 0:40:07阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/11 23:15:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →