为什么 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 里实现。