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

C++如何应用SOLID设计原则?(代码示例)

梦涛姑娘_4927

梦涛姑娘_4927

发布时间:2025-12-21 17:57:07

|

141人浏览过

|

来源于php中文网

原创

C++中应用SOLID原则的核心是合理划分职责、抽象接口、管理依赖与约束继承。1. SRP要求类只做一件事;2. OCP通过虚函数/策略模式支持扩展不修改;3. LSP强调子类可安全替换父类;4. ISP主张小而专的接口;5. DIP要求高层依赖抽象而非具体实现。

c++如何应用solid设计原则?(代码示例)

在C++中应用SOLID原则,核心不是强行套用术语,而是通过合理的类职责划分、接口抽象、依赖管理与继承约束,让代码更易维护、可扩展、可测试。下面结合常见场景,用简洁、真实的C++代码说明每条原则怎么落地。

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

类的职责越聚焦,修改风险越低。比如“订单处理”和“订单日志记录”应分离,而不是塞进同一个Order类。

// ❌ 违反SRP:Order既处理业务逻辑,又负责写日志
class Order {
public:
    void process() { /* ... */ }
    void logToDatabase() { /* ... */ }  // 职责混杂
};
<p>// ✅ 符合SRP:职责拆分,Order专注业务,Logger专注输出
class Order {
std::string id_;
public:
void process() { /<em> 核心流程,不碰IO </em>/ }
};</p><p>class OrderLogger {
public:
void log(const Order& order) {
std::cout << "Logging order: " << order.id_ << "\n";
}
};

关键点:当一个类出现“因为XX原因要改”和“因为YY原因要改”时,大概率该拆了。C++里尤其注意避免把文件操作、网络调用、日志、校验全堆在一个类里。

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

新增功能不改原有代码,靠派生或组合实现。C++常用虚函数+多态,或策略模式+模板/运行时多态。

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

// ✅ 支持添加新支付方式,无需动PaymentProcessor原有逻辑
class PaymentStrategy {
public:
    virtual ~PaymentStrategy() = default;
    virtual void pay(double amount) const = 0;
};
<p>class CreditCardStrategy : public PaymentStrategy {
void pay(double amount) const override {
std::cout << "Charging $" << amount << " to credit card\n";
}
};</p><p>class PayPalStrategy : public PaymentStrategy {
void pay(double amount) const override {
std::cout << "Paying $" << amount << " via PayPal\n";
}
};</p><p>class PaymentProcessor {
std::unique<em>ptr<PaymentStrategy> strategy</em>;
public:
void setStrategy(std::unique<em>ptr<PaymentStrategy> s) {
strategy</em> = std::move(s);
}
void execute(double amount) {
if (strategy<em>) strategy</em>->pay(amount);
}
};

注意:别为“可能扩展”提前抽象——先有具体需求再提炼接口。C++中用std::unique_ptr管理策略,避免裸指针和内存泄漏。

Liskov替换原则(LSP):子类能无缝替代父类

继承不是为了代码复用,而是为了多态替换。子类不能破坏父类契约(比如改写后抛异常、缩小前置条件、扩大后置条件)。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
// ❌ 违反LSP:Rectangle和Square语义冲突
class Rectangle {
protected:
    double width_, height_;
public:
    virtual void setWidth(double w) { width_ = w; }
    virtual void setHeight(double h) { height_ = h; }
    double area() const { return width_ * height_; }
};
<p>class Square : public Rectangle {
public:
void setWidth(double w) override { width<em> = height</em> = w; }
void setHeight(double h) override { width<em> = height</em> = h; }
// 问题:用户调用setHeight后,width也变了,area行为不可预测
};</p><p>// ✅ 更安全做法:不用继承,用组合 + 接口
class Shape {
public:
virtual double area() const = 0;
virtual ~Shape() = default;
};</p><p>class Rectangle : public Shape {
double w<em>, h</em>;
public:
Rectangle(double w, double h) : w<em>(w), h</em>(h) {}
double area() const override { return w<em> * h</em>; }
};</p><p>class Square : public Shape {
double side<em>;
public:
Square(double s) : side</em>(s) {}
double area() const override { return side<em> * side</em>; }
};

C++中特别注意:不要重写虚函数却改变其异常规范(noexcept)、返回类型(协变除外)、参数语义。用override显式标注,编译器会帮你检查。

接口隔离原则(ISP):用多个小而专的接口,代替庞大臃肿的接口

客户端不该被迫依赖它不用的接口。C++没有interface关键字,但可用纯虚类模拟;也可用模板约束(requires)配合概念(C++20)。

// ❌ 大而全的接口,PrinterUser必须实现所有,哪怕只打印
class Printer {
public:
    virtual void print() = 0;
    virtual void scan() = 0;
    virtual void fax() = 0;
};
<p>// ✅ 拆成三个独立接口,按需实现
class Printable { public: virtual void print() = 0; };
class Scannable { public: virtual void scan() = 0; };
class Faxable   { public: virtual void fax() = 0; };</p><p>class SimplePrinter : public Printable {
void print() override { std::cout << "Printing...\n"; }
};</p><p>class MultiFunctionDevice : public Printable, public Scannable, public Faxable {
void print() override { /<em> ... </em>/ }
void scan()  override { /<em> ... </em>/ }
void fax()   override { /<em> ... </em>/ }
};

实际项目中,还可结合PIMPL或桥接模式隐藏实现细节。C++20后,用concept进一步约束模板参数(如requires Printable),比动态多态更轻量。

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

高层模块(如业务逻辑)不应依赖低层模块(如数据库、网络),二者都应依赖抽象(接口)。C++中通过构造注入、setter注入或工厂实现。

// ❌ 高层直接new具体类,紧耦合
class UserService {
    Database db_; // 直接依赖具体类
public:
    bool saveUser(const User& u) { return db_.save(u); }
};
<p>// ✅ 依赖抽象,运行时注入具体实现
class DatabaseInterface {
public:
virtual ~DatabaseInterface() = default;
virtual bool save(const User& u) = 0;
};</p><p>class UserService {
std::unique<em>ptr<DatabaseInterface> db</em>;
public:
explicit UserService(std::unique<em>ptr<DatabaseInterface> db)
: db</em>(std::move(db)) {}</p><pre class="brush:php;toolbar:false;">bool saveUser(const User& u) { return db_->save(u); }

};

// 使用时才决定具体实现 auto service = UserService{std::make_unique()};

小技巧:C++中优先用值语义或智能指针传入依赖,避免全局单例或静态工厂——它们会让单元测试难以Mock,也隐藏了依赖关系。

基本上就这些。SOLID不是代码教条,而是设计意识。C++里灵活运用虚函数、智能指针、RAII、模板和现代特性(如concept、module),能让SOLID落地得自然不僵硬。不复杂但容易忽略——真正难的,是判断什么时候该抽象、什么时候该保持简单。

热门AI工具

更多
DeepSeek

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

Lovart
Lovart Hot

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

豆包大模型

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

咔片AIPPT

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

WorkBuddy

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

音述AI
音述AI Hot

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

相关专题

更多
java多态详细介绍
java多态详细介绍

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

355

2025.11.27

java多态详细介绍
java多态详细介绍

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

355

2025.11.27

java多态详细介绍
java多态详细介绍

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

355

2025.11.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3208

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5169

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3849

2025.12.29

java接口相关教程
java接口相关教程

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

486

2026.01.19

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

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

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