Вы можете добавить виртуальную функцию к интерфейсу 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();
}
Обратите внимание, что здесь не требуется явное приведение.