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

1. 什么是虚函数?

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

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

例如:

cpp 复制代码
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. 举个例子:

cpp 复制代码
// 基类:通信协议的"接口标准"
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 { /* ... */ }
};

使用时:

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

delete protocol;

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


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

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

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

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

小结

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

相关推荐
法哥20127 小时前
用 C++ 控制 CMW100,到底在干什么?
开发语言·c++
sun༒7 小时前
Spring @Scheduled 定时任务详解:Cron表达式、执行顺序、优先级与并行调度
java·后端·spring
QH139292318808 小时前
NVIDIA H200 H300服务器
运维·服务器·开发语言·网络·信息与通信
一次旅行8 小时前
DeepSeek‑V4‑Flash‑Vision‑Exp 小白入门实战|3种传图方式、完整可跑代码、避坑排障
java·前端·人工智能
OPEN-F8 小时前
Python进阶教程:单元测试与代码质量
开发语言·python·单元测试
阿里嘎多学长8 小时前
2026-08-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
野生技术架构师8 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
其实防守也摸鱼8 小时前
Codex破局:前端组件秒级生成的技术文章大纲
开发语言·前端·人工智能·学习·安全·web安全
AI人工智能+电脑小能手8 小时前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
奥莱维8 小时前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库