Множественное наследование с реализацией по умолчанию не работает - вынужден всегда переопределять реализацию по умолчанию - PullRequest
0 голосов
/ 27 апреля 2018

Что я хочу сделать

  • Я хочу иметь базовый интерфейс и множество подчиненных интерфейсов, расширяющих этот базовый интерфейс
  • Я хочу реализацию по умолчанию интерфейса по умолчанию
  • Я хочу, чтобы все мои реализации подчиненного интерфейса расширяли реализацию по умолчанию и переопределяли только те методы, которые им нужны

Я определил следующие общедоступные интерфейсы - они необходимы для 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 в заголовок, и все работает (дополнительно я удаляю виртуальное наследование). Мне любопытно, если это можно решить без перемещения реализации по умолчанию в заголовок ...

1 Ответ

0 голосов
/ 27 апреля 2018

Проблема с неоднозначностью. Вы должны реализовать GetNodeVersion в ISomeProfile. В противном случае SomeProfile::ISomeProfile::GetNodeVersion не определяется и является абстрактным. Рассмотрим этот код:

class IMasterProfile
{
public:
    virtual int GetNodeVersion() = 0;
};

class ISomeProfile : public IMasterProfile
{
public:
    virtual void SwapData() = 0;
    int GetNodeVersion() override { return 2; };
};

class MasterProfile : virtual IMasterProfile
{
public:
 int GetNodeVersion() override { return 3; };
// ...
};

class SomeProfile : public MasterProfile, public virtual ISomeProfile
{
public:
    SomeProfile(){ std::cout<<ISomeProfile::GetNodeVersion();}
    void print()
    {
        std::cout<<GetNodeVersion(); // ERROR: Call to the "GetNodeVersion" is ambiguous
        std::cout<<MasterProfile::GetNodeVersion(); // Call to the GetNodeVersion from MasterProfile
        std::cout<<ISomeProfile::GetNodeVersion(); // Call to the GetNodeVersion from ISomeProfile, without implementing it's virtual method
    }
    void SwapData() override { }
};

Так что проблема в строке, когда вы хотите использовать в SomeProfile:

std::cout<<ISomeProfile::GetNodeVersion(); // Call to the GetNodeVersion from ISomeProfile, without implementing it's virtual method

Без реализации вы не можете сделать это, требуется определение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...