C++ virtual void StartNetwork() = 0; // 纯虚:子类必须实现,否则不能 new。

为什么 StartSensor() = 0 会报错?

当时只有 WaveshareEsp32p4 实现了 StartSensor(),而 WifiBoard 没有。

继承关系是:

Board (StartSensor = 0,纯虚)

└── WifiBoard (没实现 StartSensor → 仍是抽象类)

└── WaveshareEsp32p4 (实现了 StartSensor)

问题在于:dual_network_board.cc 里有:

current_board_ = std::make_unique<WifiBoard>(); // 直接 new WifiBoard

WifiBoard 因为没实现 StartSensor(),变成了抽象类 → 不能实例化 → 编译报错。


两种写法对比

virtual void StartNetwork() = 0; // 纯虚:子类必须实现,否则不能 new

virtual void StartSensor() {} // 普通虚函数 + 空实现:子类可选重写

写法 含义 适用场景
= 0 强制每个具体板型都必须实现 所有板都要有的能力,如联网
{} 空实现 基类有默认行为(什么都不做) 只有部分板型需要的功能,如 SHT40 传感器

总结

  • = 0 不是"给变量赋 0",而是"声明纯虚函数"。
  • StartNetwork 能写 = 0,是因为 WifiBoard 等中间类都实现了它。
  • StartSensor 当时写 = 0 却只在最底层子类实现,中间类 WifiBoard 变抽象,有人直接 new WifiBoard() 就崩了。
  • 所以 StartSensor 改成 {} 更合适:没有传感器的板型用默认空实现即可,只有 WaveshareEsp32p4 重写并调用 sensor_sht40_->StartTask()

如果你希望 StartSensor 也强制各板型必须显式实现(写 = 0),需要在 WifiBoard 里加 virtual void StartSensor() override {}(空实现或具体逻辑),而不能只在 WaveshareEsp32p4 里实现。

相关推荐
知无不研2 小时前
对套接字的深入理解
linux·服务器·网络·c++·socket·网络套接字
hai3152475433 小时前
FlashAttention C语言(C++)实现(展示版)
c语言·开发语言·c++·人工智能·算法
wuminyu4 小时前
Java锁机制之Java对象重量级锁源码剖析
java·linux·c语言·jvm·c++
郝学胜_神的一滴4 小时前
Qt 高级开发 026:QTabWidget御道,从筑基到化境
c++·qt
apocelipes5 小时前
GNU GCC 多版本函数扩展
c语言·c++·linux编程
代码中介商5 小时前
C++完美转发与引用折叠全解析
开发语言·c++
雪度娃娃6 小时前
ASIO异步通信——多线程模型
开发语言·网络·c++·php
王老师青少年编程8 小时前
信奥赛C++提高组csp-s之搜索进阶(迭代加深IDDFS)
c++·csp·信奥赛·csp-s·提高组·iddfs·埃及分数
liulilittle8 小时前
我从 BBRv1 到 KCC 的思考
网络·c++·tcp/ip·计算机网络·tcp·bbr·通信