我具有以下课程结构:
现在我有一个Device
指针,在这里我知道它的类型为WiredHeadphone
或RadioHeadphone
。我需要将此指针转换为HeadphoneInterface
。
在一个完美的世界中,我只会使用dynamic_cast。不幸的是,我在一个完全不支持dynamic_cast的嵌入式平台上。目前,我正在这样做:
HeadphoneInterface *GetDeviceAsHeadphone(Device* dev) {
// use my own type system to identify the actual type and cast accordingly:
if(dev->GetType() == Type_WiredHeadphone) {
return static_cast<HeadphoneInterface*>((WiredHeadphone *)dev);
} else if(dev->GetType() == Type_RadioHeadphone) {
return static_cast<HeadphoneInterface*>((RadioHeadphone *)dev);
} else {
return NULL;
}
}
这很丑陋,无法维护。将来会有更多的耳机设备,我不想每次都更新此功能。 有解决这个问题的更好方法吗?
答案 0 :(得分:3)
您可以将虚拟函数添加到Device
界面中,以为您执行(交叉)强制转换为HeadphoneInterface
:
struct HeadphoneInterface;
struct Device {
// ...
virtual HeadphoneInterface* getHeadphoneInterface() noexcept { return 0; }
// ...
};
并覆盖WiredHeadphone
和RadioHeadphone
中的函数以返回指向HeadphoneInterface
的非空指针:
struct WiredHeadphone : WiredDevice, HeadphoneInterface {
HeadphoneInterface* getHeadphoneInterface() noexcept override { return this; }
};
然后GetDeviceAsHeadphone
变为:
inline HeadphoneInterface* GetDeviceAsHeadphone(Device* dev) noexcept {
return dev->getHeadphoneInterface();
}
请注意,此处不需要显式强制转换。