static_cast 与无关 类

static_cast with unrelated classes

我有以下 class 结构:

现在我有一个 Device 指针,我知道它是 WiredHeadphoneRadioHeadphone 类型。我需要将此指针转换为 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;
    }
}

这太丑陋了,而且无法维护。以后Headphone设备会越来越多,不想每次都更新这个功能。 有没有更好的方法来解决这个问题?

您可以将虚函数添加到 Device 接口,为您执行(交叉)强制转换为 HeadphoneInterface

struct HeadphoneInterface;

struct Device {
// ...
    virtual HeadphoneInterface* getHeadphoneInterface() noexcept { return 0; }
// ...
};

并将 WiredHeadphoneRadioHeadphone 中的函数覆盖为 return 指向 HeadphoneInterface 的非空指针:

struct WiredHeadphone : WiredDevice, HeadphoneInterface {
    HeadphoneInterface* getHeadphoneInterface() noexcept override { return this; }
};

那么GetDeviceAsHeadphone就变成了:

inline HeadphoneInterface* GetDeviceAsHeadphone(Device* dev) noexcept {
    return dev->getHeadphoneInterface();
}

请注意,此处不需要显式转换。