Что я хочу сделать
- Я хочу иметь базовый интерфейс и множество подчиненных интерфейсов, расширяющих этот базовый интерфейс
- Я хочу реализацию по умолчанию интерфейса по умолчанию
- Я хочу, чтобы все мои реализации подчиненного интерфейса расширяли реализацию по умолчанию и переопределяли только те методы, которые им нужны
Я определил следующие общедоступные интерфейсы - они необходимы для SDK. Я разрабатываю плагины для
// the base interface
class DYNAMIC_ATTRIBUTE IMasterProfile : public IVWUnknown
{
public:
virtual Uint16 VCOM_CALLTYPE GetNodeVersion() = 0;
// ...
}
// one of many sub interfaces extending the default one
class DYNAMIC_ATTRIBUTE ISomeProfile : public IMasterProfile
{
public:
virtual void VCOM_CALLTYPE SwapData() = 0;
};
Моя реализация выглядит следующим образом:
class DYNAMIC_ATTRIBUTE MasterProfile : public virtual IMasterProfile
{
public:
Uint16 VCOM_CALLTYPE GetNodeVersion() override { return 0; };
// ...
}
class DYNAMIC_ATTRIBUTE SomeProfile : public MasterProfile, public virtual ISomeProfile
{
public:
void VCOM_CALLTYPE SwapData() override { }
}
Проблемы:
Компилятор жалуется, что SomeProfile
является абстрактным и не реализовал функцию GetNodeVersion
. Как я могу решить это? SomeProfile
расширяет MasterProfile
, и этот класс реализует функцию GetNodeVersion
...
РЕДАКТИРОВАТЬ: Возможное решение
Я могу переместить реализацию по умолчанию IMasterProfile
в заголовок, и все работает (дополнительно я удаляю виртуальное наследование). Мне любопытно, если это можно решить без перемещения реализации по умолчанию в заголовок ...