news 2026/4/18 8:45:01

《你真的了解C++吗》No.023:私有继承的哲学——“实现基于”而非“是一种”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《你真的了解C++吗》No.023:私有继承的哲学——“实现基于”而非“是一种”

《你真的了解C++吗》No.023:私有继承的哲学——“实现基于”而非“是一种”

导言:被隐藏的继承

在 C++ 中,如果你在继承时不写访问限定符,class默认就是私有继承(Private Inheritance)。

classTimer{public:voidstart();voidtick();};classEngine:privateTimer{// Engine 并不是一个 Timer};

当你进行私有继承时,基类的所有公有成员在派生类中都会变成私有的。这意味着外界无法通过Engine调用start()。更重要的是,你无法再将Engine*隐式转换为Base*。多态在这里失效了。


一、 语义的转变:Implemented In Terms Of

私有继承并不代表“Engine 是一个 Timer”,它的真实含义是:“Engine 的实现利用了 Timer 的功能”

这在软件工程中被称为“根据某物实现出”(Implemented in terms of)。你只是想借用基类的代码逻辑,但你并不想让外界知道这两个类之间有任何关联,也不希望别人把你当成基类来对待。


二、 私有继承 vs 组合(Composition)

你可能会问:“如果只是想利用另一个类的功能,我直接把那个类作为我的成员变量(组合)不就行了吗?”

classEngine{private:Timer t;// 组合:通常更推荐这种做法};

确实,在 95% 的情况下,你应该优先使用组合。组合逻辑更清晰,耦合度更低。但私有继承在以下两个特殊场景中具有不可替代的优势:

1. 访问保护成员(Protected Members)

如果你需要利用基类的protected成员或函数,组合方式是做不到的(因为类外部无法访问protected),只有继承才能打开这扇门。

2. 重写虚函数

这是最常见的理由。如果你想利用某个类,但又必须重写它的某个虚函数(例如某种回调或通知机制),你就必须继承它。由于你又不想让外界发现这种继承关系,私有继承就是最佳选择。

3. 空基类优化(EBO)

我们在 No.017 聊过。如果你要持有一个“空类”作为工具,组合会占用 1 字节(对齐后可能变 4 字节),而私有继承可以利用 EBO 将开销降为0。这在 STL 容器管理分配器(Allocator)时被大量使用。


三、 权限的精细控制:Using 声明

私有继承后,所有的基类成员都躲起来了。但如果你觉得其中一两个函数对外界依然有用,你可以利用using关键字有选择地把它们“恢复”出来:

classEngine:privateTimer{public:usingTimer::start;// 仅仅把 start 重新暴露为 public};

四、 架构建议:不要滥用

  • 公有继承:表达的是接口继承。你承诺遵守基类的所有协议。
  • 私有继承:表达的是实现继承。你只是在“偷用”代码。

如果你发现自己只是想复用逻辑,请先考虑组合。只有当你确定需要处理虚函数、访问受保护成员或压榨内存(EBO)时,再祭出私有继承这柄利刃。


总结:低调的工具

  • 私有继承切断了**向上转型(Upcasting)**的路径,终结了多态。
  • 它是实现类内部逻辑的一种手段,而不是对外展示的身份。
  • 理解了私有继承,你才算真正理解了 C++ 如何在“复用代码”和“类型安全”之间做精细手术。

下一篇预告:继承关系通常是一棵树,但如果这棵树长歪了,出现了“两个爷爷”的情况,该怎么办?

➡️《你真的了解C++吗》No.024:菱形继承的解决方案——虚继承的内存布局。

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

大模型学习路线图:从小白到AI专家的成长之路_【2026最新】大模型AI产品经理学习路线

文章提供了大模型产品经理从零基础到精通的完整学习路线,涵盖基础知识、大模型技术、产品管理、实战经验和持续学习五大阶段。同时介绍了大模型在教育、医疗、金融等领域的应用场景,并提供了学习资源获取方式。这条系统性学习路径旨在帮助读者掌握大模型…

作者头像 李华
网站建设 2026/4/18 0:27:02

系统软件出现msvcp140.dll文件找不到 如何修复? 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/18 0:26:42

paperxie 毕业论文写作工具:解锁高效学术创作的智能密钥

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippt https://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 在学术评价体系日趋严格的当下,毕业论文不仅是学生学业生涯的收官之作,更是衡量其科研能…

作者头像 李华
网站建设 2026/4/18 0:30:10

Android16 设置AP热点不自动关闭和热点默认设置5G

1.让ap热点不自动关闭: packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml <integer translatable="false" name="config_wifiFrameworkSoftApShutDownTimeoutMilliseconds">600000</integer> 修改为: <int…

作者头像 李华
网站建设 2026/4/17 7:43:52

AI agents协作分析社交网络:评估公司的社会影响力

AI agents协作分析社交网络&#xff1a;评估公司的社会影响力关键词&#xff1a;AI agents、社交网络分析、公司社会影响力评估、协作机制、数据挖掘摘要&#xff1a;本文聚焦于利用AI agents协作分析社交网络来评估公司的社会影响力。首先介绍了研究背景、目的和预期读者等内容…

作者头像 李华