【发布时间】:2021-07-26 10:44:42
【问题描述】:
我有以下课程:
class ATemperatureDevice{};
class AHumidityDevice{};
class BluetoothLeDevice{};
class Sensor1 : BluetoothLeDevice, ATemperatureDevice, AHumidityDevice {};
class Sensor2 : BluetoothLeDevice, AHumidityDevice {};
我有一个vector<BluetoothLeDevice*>,所有设备都存储在这里。
ATemperatureDevice、AHumidityDevice 和 BluetoothLeDevice 类具有虚函数。
当我选择一个时,我有一个 BluetoothLeDevice。现在我想检查它是否来自 ATemperatureDevice 和/或 AHumidityDevice。
我尝试了 dynamic_cast,当它不可转换时,我应该得到 null,但它说“-fno-rtti 不允许使用'dynamic_cast'”,尽管它们具有虚函数。
检查和投射的最佳方法是什么?
【问题讨论】:
-
你使用
-fno-rtti编译器标志吗? -
顺便说一句,
vector<BluetoothLeDevice>不能保存BluetoothLeDevice子类的对象,它只能保存BluetoothLeDevice类型的对象 -
普通对象不能有多态性。您的向量将仅存储
BluetoothLeDevice对象,如果您尝试添加例如,将导致 对象切片Sensor1对象。要使多态性起作用,您需要引用或 指针。 -
在解决了上述对象切片问题之后:正确的方法是使用虚函数。无论您认为需要显式转换的原因是什么:这是错误的。这就是虚函数的用途。
-
顺便说一句,您的设计似乎有点缺陷。我建议您使用包含多个传感器的单个设备。每个传感器只能是一种类型(温度、湿度等)。所有传感器都有一个通用的
BaseSensor类,它定义了读取传感器值的接口。然后例如TemperatureSensor实现了BaseSensor接口。然后你的BluetoothLeDevice有一个指向BaseSensor的指针向量,用于设备的所有传感器。
标签: c++ oop c++11 arduino esp32