讲师中心 微信公众号
AI工具推荐 视频效率加速

c++的SOLID原则是什么 面向对象设计的五大基石【架构思想】

小宇大大_7540

小宇大大_7540

发布时间:2025-12-18 09:03:07

|

862人浏览过

|

来源于php中文网

原创

SOLID 是面向对象设计的五大通用原则,适用于C++等支持面向对象的语言,旨在提升代码可维护性、可扩展性与低耦合性;其包含单一职责、开闭、里氏替换、接口隔离和依赖倒置原则,强调抽象、组合与契约式设计。

c++的solid原则是什么 面向对象设计的五大基石【架构思想】

SOLID 不是 C++ 专属的原则,而是面向对象设计(OOD)的五大通用架构原则,由 Robert C. Martin 提出,适用于任何支持面向对象特性的语言(包括 C++)。它不是语法规范,也不是 C++ 标准的一部分,而是一套帮助开发者写出可维护、可扩展、可测试、低耦合、高内聚代码的设计思想。在 C++ 工程中,正确应用 SOLID 能显著降低大型项目重构成本和模块间意外依赖。

单一职责原则(SRP):一个类只做一件事

一个类应该只有一个引起它变化的原因。在 C++ 中,这意味着类的接口(public 成员函数)应围绕同一业务概念组织,避免把“读配置”“解析 JSON”“写日志”全塞进一个 ConfigLoader 类里。否则,改日志格式可能意外破坏配置加载逻辑。

  • 判断方法:当你为类增加新功能时,是否需要修改已有成员函数的实现?如果频繁出现,说明职责已扩散
  • C++ 实践建议:用命名空间隔离不同关注点;用 PIMPL 模式隐藏实现细节;将 IO、序列化、策略算法拆分为独立类或策略类(如 std::function 或模板参数)
  • 反例:class UserManager { public: void loadFromFile(); void saveToFile(); void validatePassword(); void sendEmail(); }; —— 持久化、校验、通知混杂

开闭原则(OCP):对扩展开放,对修改关闭

软件实体(类、模块、函数)应该易于扩展新行为,但无需修改原有代码。C++ 中主要通过抽象(纯虚类)、模板、策略模式、依赖注入来实现。

  • 核心手段:定义稳定接口(class Shape { virtual double area() const = 0; }),让具体形状(Circle、Rect)继承并实现,新增 Triangle 无需改动计算总面积的函数
  • C++ 特色支持:模板可零成本抽象(template<typename t> void process(const T& obj)</typename>),std::variant + std::visit 支持类型安全的扩展分支
  • 注意陷阱:过度抽象会增加复杂度;优先用组合+接口代替继承深链;避免“为未来可能的需求提前扩展”

Liskov 替换原则(LSP):子类型必须能替换父类型

所有使用基类指针/引用的地方,换成其任意派生类对象后,程序行为不变且不抛出意外异常。这是继承关系的语义契约,不是语法允许就行。

Work Productivity Word Mail Workflow Helper
Work Productivity Word Mail Workflow Helper

构建并排查Microsoft Word邮件合并及DOCX模板工作流,使用合并域、内容控件、文档属性、重复区块、数据等

下载

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

  • C++ 中常见违反:派生类重写虚函数时加强前置条件(如要求参数 > 0,而基类允许 0)、削弱后置条件(返回空指针而非约定非空)、改变异常规格(基类 noexcept,子类 throw)、修改可变性(基类 const 成员函数,子类内部修改 mutable 成员破坏逻辑不变性)
  • 验证方式:若基类有文档契约(如“add() 总是使 size() 增加 1”),每个派生类都必须满足
  • 替代方案:当继承难以满足 LSP,优先用组合(Has-a)或类型擦除(如 std::any / 自定义 type-erased wrapper)

接口隔离原则(ISP):客户不应依赖它不需要的接口

不要强迫客户端依赖庞大臃肿的接口。C++ 中应避免“上帝接口”,而按调用方角色拆分成小而专注的抽象类。

  • 典型问题:class IWorker { virtual void work() = 0; virtual void eat() = 0; virtual void sleep() = 0; } —— 机器人实现 eat/sleep 无意义,却必须提供空实现
  • C++ 推荐做法:定义多个窄接口,如 IWorkable、IFeedable,让 Human 继承两者,Robot 只继承 IWorkable
  • 结合现代 C++:用 concept 约束模板参数(template<typename t> requires Workable<t> void startShift(T& w);</t></typename>),比运行时虚函数更轻量且编译期检查

依赖倒置原则(DIP):依赖抽象,不依赖具体

高层模块(业务逻辑)不应依赖低层模块(数据库、网络),二者都应依赖抽象(接口)。抽象不应依赖细节,细节应依赖抽象。

  • C++ 实现关键:用指针/引用持有抽象基类(std::unique_ptr<istorage></istorage>),通过构造函数或 setter 注入,而非在类内部 new 具体类型
  • 避免硬编码依赖:class OrderService { Database db_; }; → 违反 DIP;应改为 class OrderService { std::unique_ptr<istorage> storage_; };</istorage>
  • 辅助机制:结合工厂模式(StorageFactory::create("redis"))或依赖注入框架(如 Boost.DI)管理生命周期,但 C++ 更推荐手动控制以保持清晰性

掌握 SOLID 不是为了死守教条,而是培养对模块边界、变化根源和抽象粒度的敏感度。在 C++ 项目中,它常与 RAII、移动语义、constexpr 等特性协同,共同支撑稳健的系统架构。不复杂但容易忽略。

相关文章

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

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

下载

相关标签:

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

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2155

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3342

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1116

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3839

2025.09.10

go语言 面向对象
go语言 面向对象

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

6695

2025.09.05

java面向对象
java面向对象

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

342

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

344

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

223

2026.04.17

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn