news 2026/6/10 22:39:57

《你真的了解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/6/9 19:57:01

深度测评8个AI论文工具:本科生毕业论文写作全解析

深度测评8个AI论文工具:本科生毕业论文写作全解析 2026年AI论文工具测评:为何需要一份精准指南 随着人工智能技术的不断进步,越来越多的本科生开始依赖AI论文工具来提升写作效率和质量。然而,面对市场上琳琅满目的选择&#xff0c…

作者头像 李华
网站建设 2026/6/10 12:56:47

租赁Anritsu MT8852B蓝牙测试仪

收到!👍 我来帮你梳理 Anritsu MT8852B蓝牙测试仪 的核心参数与典型应用场景,接下来会从功能、支持标准到实际用途全面展开。 该设备支持蓝牙BR/EDR/BLE多种模式的射频与音频测试,并兼容最新蓝牙5.x标准,广泛用于研发验…

作者头像 李华
网站建设 2026/6/10 12:51:24

msvcp140_1.dll文件丢失找不到问题 免费下载方法分享

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

作者头像 李华
网站建设 2026/6/10 12:52:32

8 款 AI 毕业论文写作工具实测:拯救你的学术秃头季

又到毕业季,看着空白的 Word 文档和导师催稿的消息,不少同学直接陷入 “论文焦虑症”。别慌!AI 写作工具已经成为当代毕业生的隐形外挂。我们实测了全网最火的 8 款 AI 毕业论文写作工具,从选题、框架到降重一站式搞定&#xff0c…

作者头像 李华