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 class Processor { Logger logger; };,新增日志行为无需改 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 db_; 引入不必要的堆分配和虚调用,若 IDatabase 仅含一两个函数,用 std::function 或模板参数更合适
// 示例:用 concept 实现 DIP,不依赖虚函数
template
concept Writable = requires(T t, std::string s) {
    { t.write(s) } -> std::same_as;
};

template void log_message(Writer& w, const std::string& msg) { w.write("[LOG] " + msg); }

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

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

832

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

3

2026.01.14

热门下载

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

精品课程

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

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.7万人学习

Java 教程
Java 教程

共578课时 | 45.8万人学习

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

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