0

0

c++的SOLID设计原则是什么? (面向对象设计)

穿越時空

穿越時空

发布时间:2026-01-14 13:48:11

|

374人浏览过

|

来源于php中文网

原创

c++适用solid原则但需适配其特性:srp需结合raii封装资源管理,避免业务类混杂生命周期逻辑;应利用值语义、移动语义和模板而非盲目套用java式继承与shared_ptr。

c++的solid设计原则是什么? (面向对象设计)

C++ 里没有专属于它的 SOLID 设计原则 —— SOLID 是面向对象设计的通用原则,语言无关,C++ 完全适用,但直接套用时容易水土不服,因为 C++ 的资源管理、值语义、RAII、模板和多重继承等特性,会让某些原则的实现方式和 Java/C# 截然不同。

为什么 C++ 中 SRP(单一职责原则)要配合 RAII 理解

在 C++ 中,一个类的“职责”往往隐含资源生命周期管理。如果只按业务逻辑切分职责,却把 std::fstreamstd::thread 的打开/关闭、启动/分离混在业务逻辑里,就实际违反了 SRP。

  • 正确做法:用 RAII 封装资源(如自定义 FileGuardLockGuard),让资源管理成为独立、可复用的类,业务类只专注领域逻辑
  • 反例:class DataProcessor { std::ofstream log_file; void process() { log_file —— 这个类同时承担数据处理 + 日志文件生命周期管理
  • C++ 特有风险:析构函数抛异常会终止程序(std::terminate),所以 RAII 类的析构必须 noexcept,否则 SRP 表面成立,实则埋雷

OCP(开闭原则)在 C++ 中靠什么落地

Java/C# 依赖抽象基类 + 运行时多态,而 C++ 更倾向编译期扩展:模板 + 概念(C++20)+ CRTP,而非强制继承体系。

  • 优先用策略模式的模板版本:template<typename logger> class Processor { Logger logger; };</typename>,新增日志行为无需改 Processor,符合 OCP
  • 虚函数不是唯一路径;过度依赖 virtual 会阻碍内联、增加 vtable 开销,还可能因对象切片破坏多态
  • 接口类(纯虚类)在 C++ 中应尽量小而稳定,避免添加新虚函数——那会破坏所有派生类的二进制兼容性(尤其动态库场景)

LSP(里氏替换原则)在 C++ 中最常被违反的点

不是“能编译通过就能替换”,而是“行为契约不被破坏”。C++ 的值语义和 const 正确性让 LSP 更微妙。

iHuzu ECWS 狐族企业建站系统1.0 beta3
iHuzu ECWS 狐族企业建站系统1.0 beta3

iHuzuCMS狐族内容管理系统,是国内CMS市场的新秀、也是国内少有的采用微软的ASP.NET 2.0 + SQL2000/2005 技术框架开发的CMS,充分利用ASP.NET架构的优势,突破传统ASP类CMS的局限性,采用更稳定执行速度更高效的面向对象语言C#设计,全新的模板引擎机制, 全新的静态生成方案,这些功能和技术上的革新塑造了一个基础结构稳定功能创新和执行高效的CMS。iHuzu E

下载

立即学习C++免费学习笔记(深入)”;

  • 子类重写虚函数时修改了前置/后置条件(比如父类允许 void set_value(int x) 接受负数,子类抛异常)→ 违反 LSP
  • 返回类型协变仅限指针/引用,且必须保持 const 正确性:Base* get() override 可返回 Derived*,但不能返回 Derived& 若父类返回 const Base&
  • 更隐蔽的坑:子类重载了父类未声明为 virtual 的函数,调用发生在静态绑定上下文(如模板函数内),看似替换成功,实则没走多态 → 行为不一致

依赖倒置(DIP)在 C++ 中别只盯着“抽象基类”

DIP 的本质是“依赖于稳定接口,而非易变实现”,但在 C++ 中,“稳定接口”可以是:

  • 概念(concept):约束模板参数行为,比虚函数更轻量、零成本,且编译期检查
  • 非成员非友元函数:如 std::swap 的 ADL 查找,解耦容器与算法
  • 策略对象(传值或完美转发):std::sort(first, last, Compare{}),依赖的是可调用对象的签名契约,不是某个基类
  • 误用警告:class Service { std::unique_ptr<idatabase> db_;</idatabase> 引入不必要的堆分配和虚调用,若 IDatabase 仅含一两个函数,用 std::function 或模板参数更合适
// 示例:用 concept 实现 DIP,不依赖虚函数
template<typename T>
concept Writable = requires(T t, std::string s) {
    { t.write(s) } -> std::same_as<bool>;
};
<p>template<Writable Writer>
void log_message(Writer& w, const std::string& msg) {
w.write("[LOG] " + msg);
}</p>

C++ 的 SOLID 不是贴标签的 checklist,而是要在值语义、移动语义、编译期多态和手动资源控制的夹缝里,找到那个既满足原则又不牺牲性能与安全的平衡点。最容易被忽略的,是把 Java 风格的继承树直接搬进 C++,然后在析构函数里 catch 异常、在接口里塞一堆虚函数、用 std::shared_ptr 包裹一切来“模拟”灵活性——这些都会让 SOLID 变成技术债加速器。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

134

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

870

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

30

2025.12.06

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

99

2025.12.01

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

9

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号