当前位置: 首页 > ds >正文

【C++】C++面向对象设计的核心思想之一: 接口抽象、解耦和可扩展性

1. 什么是虚函数?

虚函数(virtual)是C++里实现“多态”的关键机制。

  • 在基类中声明虚函数,在子类中可以**覆盖(override)**它们。
  • 通过基类指针/引用操作时,自动调用实际对象(子类)的实现

例如:

class TComProtocolBase {
public:virtual bool SetParam(int addr, int value) = 0; // 纯虚函数virtual void StartMonitor() = 0;// ...
};
  • 这是一个抽象接口/基类(不能直接new出来,只能当指针/引用用)。
  • 子类继承时必须实现这些函数。

2. 这样设计有什么用?

(1)面向接口编程,解耦各层逻辑

  • 上层代码可以依赖TComProtocolBase接口,而不关心具体用的哪个协议(比如Modbus、CAN、自定义协议等)。
  • 后续可以新增不同的协议实现,只需要继承基类,不用改动上层代码

(2)多协议/多硬件扩展容易

  • 比如设备A用Modbus,设备B用自定义协议,设备C用CAN。
  • 只要写不同的子类,分别实现这些虚函数,上层只用一套调用方式,大大增强可维护性和可移植性。

(3)便于单元测试和Mock

  • 写测试时,可以很方便写一个FakeProtocol继承基类做“假装通信”,不用真连硬件。

(4)团队分工更明确

  • 通信协议开发和业务开发可以分开,彼此只需遵守接口约定,降低沟通成本。

3. 举个例子:

// 基类:通信协议的“接口标准”
class TComProtocolBase {
public:virtual bool SetParam(int addr, int value) = 0;virtual void StartMonitor() = 0;// ... 还有其它命令接口
};// 子类1:实际实现一种协议
class TComProtocolV1 : public TComProtocolBase {
public:bool SetParam(int addr, int value) override {// 协议1的实现}void StartMonitor() override { /* ... */ }
};// 子类2:实现另一种协议
class TComProtocolV2 : public TComProtocolBase {
public:bool SetParam(int addr, int value) override {// 协议2的实现}void StartMonitor() override { /* ... */ }
};

使用时:

TComProtocolBase* protocol = new TComProtocolV1();
protocol->SetParam(0x100, 42);  // 实际调用的是V1的实现delete protocol;

后续切换成V2协议实现,只需替换new对象的类型即可,调用方式不用变。


4. 为什么不是直接写死?

  • 如果直接写死协议细节,后续想支持多协议、多硬件,需要全改一遍业务层,非常痛苦。
  • 用虚函数(接口/抽象基类),可以让业务层面向抽象而不是实现,极大增强代码的灵活性。

5. 这也是现代C++、C#、Java等主流语言面向对象的精髓

  • 编程面向接口,而不是面向实现
  • 易于扩展,易于维护,支持插件化和多协议共存。

小结

“基类定义虚函数接口,子类实现具体协议,业务层只需依赖接口即可;后续新增/切换协议无需大改动,维护和扩展都很方便。”

http://www.xdnf.cn/news/10138.html

相关文章:

  • Python打卡训练营Day40
  • 半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司
  • 如何迁移SOS数据库和修改sos服务的端口号
  • php:5.6-apache Docker镜像中安装 gd mysqli 库 【亲测可用】
  • Asp.Net Core FluentValidation校验框架
  • 3. JavaScript基础:自增自减、运算符优先级、条件语句、循环与错误处理
  • 跟我学c++中级篇——动态库的资源处理
  • 2025年渗透测试面试题总结-匿名[校招]红队攻防工程师(题目+回答)
  • 机器人变量类型与配置
  • 引领机器人交互未来!MANUS数据手套解锁精准手部追踪
  • 大数据量下的数据修复与回写Spark on Hive 的大数据量主键冲突排查:COUNT(DISTINCT) 的陷阱
  • Linux入门——入门常用基础指令(3)
  • 课程介绍:《ReactNative基础与实战指南2025》
  • 【前端优化】使用speed-measure-webpack-plugin分析前端运行、打包耗时,优化项目
  • 20250530-C#知识:万物之父Object
  • 云原生应用架构设计原则与落地实践:从理念到方法论
  • 通信算法之280:无人机侦测模块知识框架思维导图
  • JS 事件循环详解
  • 告别重复 - Ansible 配置管理入门与核心价值
  • 在 Linux 上安装 Minikube:轻松搭建本地 Kubernetes 单节点集群
  • 项目管理工具Maven
  • java/mysql/ES下的日期类型分析
  • 【FlashRAG】本地部署与demo运行(二)
  • PHP7内核剖析 学习笔记 第九章 PHP基础语法的实现
  • [特殊字符] xbatis 一款好用 ORM 框架 1.8.8-M2 发布,节省 1/3 代码和时间的框架!!!
  • Drawio编辑器二次开发
  • 【pytorch学习】土堆pytorch学习笔记2
  • 【Linux】权限相关指令
  • Axure疑难杂症:中继器新增数据时如何上传并存储图片(玩转中继器)
  • 【仿生机器人系统设计】涉及到的伦理与安全问题