全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++中的SOLID原则是什么_c++面向对象设计五大原则【架构】

SOLID是面向对象设计的五大通用原则,适用于C++等所有支持OOP的语言,强调职责划分、依赖抽象与扩展性,需结合C++特性(虚函数、模板、组合等)灵活实践,而非机械套用其他语言模式。

SOLID 不是 C++ 专属的概念,而是面向对象设计的五大通用原则,由 Robert C. Martin 提出,适用于所有支持面向对象特性的语言(包括 C++)。它不依赖语法糖,而关注类与模块之间的职责划分、依赖关系和扩展方式。在 C++ 中践行 SOLID,关键在于合理使用类、虚函数、接口(抽象基类)、模板、组合等机制,而非强行套用 Java 或 C# 的写法。

单一职责原则(SRP)

一个类应该只有一个引起它变化的原因。C++ 中常见反例是把数据封装、序列化、网络发送、日志记录全塞进一个类里。

  • 拆分策略:用小类各司其职,比如 UserData 只管字段,UserSerializer 负责 JSON 序列化,UserRepository 处理存储逻辑
  • 注意头文件依赖:SRP 做得好,能减少 #include 级联,加快编译
  • 不是“一个类一个函数”,而是“一个类聚焦一个业务概念”

开闭原则(OCP)

对扩展开放,对修改关闭。C++ 实现时主要靠多态 + 抽象基类,或策略模式 + 模板参数。

  • 定义纯虚接口(如 class ILogger { public: virtual void log(const std::string&) = 0; };),具体实现(FileLoggerConsoleLogger)可自由增删
  • 避免在已有函数里加 if (type == X) {...} else if (type == Y) {...} 这类分支逻辑
  • 模板也可支持 OCP:比如容器算法接受任意满足概念(Concept)的迭代器,无需修改算法本身

里氏替换原则(LSP)

子类型必须能替换其基类型,且不破坏程序正确性。C++ 中容易踩坑的地方集中在虚函数重写和 const 正确性上。

  • 派生类不能削弱基类的前置条件(比如基类允许空指针,子类却断言非空)
  • 不能加强后置条件(比如基类返回值范围是 [0,100],子类缩窄成 [50,80] 就违反 LSP)
  • 重写虚函数时,签名要一致,constnoexcept 属性也应兼容(子类可比基类更严格,但不能更宽松)

接口隔离原则(ISP)

客户端不应依赖它不需要的接口。C++ 没有 interface 关键字,但可用轻量抽象基类模拟。

  • 避免大而全的基类(如 IEntity 同时含 render()save()updateAI()),按角色拆成 IRenderableISavableIAIUpdatable
  • 组合优于继承:一个类可通过持有多个小接口指针(std::unique_ptr + std::unique_ptr)获得能力,而非从巨无霸基类继承
  • 头文件粒度也适用 ISP:只包含真正需要的接口头,别为省事 #include "everything.h"

依赖倒置原则(DIP)

高层模块不应依赖低层模块,二者都应依赖抽象;抽象不应依赖细节,细节应依赖抽象。

  • C++ 中“抽象”通常是带虚函数的基类或概念约束(C++20 Concepts),而不是具体实现类
  • 例如:业务逻辑类 OrderProcessor 依赖 IChargeService&,而不是 PayPalServiceStripeService
  • 构造时注入依赖(通过构造函数参数或 setter),避免内部 new 具体类型——这便于单元测试和替换实现
  • 注意:DIP 不等于“所有东西都要抽象”,IO、网络、时间等易变部分优先抽象,稳定的核心算法可直接调用

基本上就这些。SOLID 在 C++ 中不是教条,而是帮助你识别僵化、脆弱、难以测试代码的“嗅探器”。用不用虚函数、要不要加一层抽象,得看变化点在哪、团队规模多大、性能是否敏感。过度设计比不设计更危险。


# c++  # java  # js  # json  # ai  # c#  # lsp 


相关文章: Swift中循环语句中的转移语句 break 和 continue  内部网站制作流程,如何建立公司内部网站?  已有域名如何免费搭建网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  沈阳制作网站公司排名,沈阳装饰协会官方网站?  如何通过免费商城建站系统源码自定义网站主题与功能?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  开心动漫网站制作软件下载,十分开心动画为何停播?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  广东企业建站网站优化与SEO营销核心策略指南  深圳网站制作案例,网页的相关名词有哪些?  网站制作报价单模板图片,小松挖机官方网站报价?  香港服务器租用每月最低只需15元?  宝塔面板创建网站无法访问?如何快速排查修复?  北京专业网站制作设计师招聘,北京白云观官方网站?  浅谈Javascript中的Label语句  Thinkphp 中 distinct 的用法解析  如何通过云梦建站系统实现SEO快速优化?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  php json中文编码为null的解决办法  高端网站建设与定制开发一站式解决方案 中企动力  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  建站之星代理商如何保障技术支持与售后服务?  建站之星如何快速解决建站难题?  c++ stringstream用法详解_c++字符串与数字转换利器  宿州网站制作公司兴策,安徽省低保查询网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何通过FTP服务器快速搭建网站?  如何选择高效稳定的ISP建站解决方案?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  招贴海报怎么做,什么是海报招贴?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  如何有效防御Web建站篡改攻击?  如何配置IIS站点权限与局域网访问?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  Swift中swift中的switch 语句  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  建站之星官网登录失败?如何快速解决?  如何在Windows 2008云服务器安全搭建网站?  如何在云主机快速搭建网站站点?  ,石家庄四十八中学官网?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  制作旅游网站html,怎样注册旅游网站?  如何用搬瓦工VPS快速搭建个人网站?  简单实现Android文件上传  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  jQuery 常见小例汇总 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。