Множественное наследование, наследование интерфейса и реализации

Можно ли наследовать как интерфейс, так и миксин реализации в одном классе? Что-то вроде этого:

class Interface
{
public:
virtual void method()=0;
};

class Component
{
public:
void method(){ /*do something*/};
};

class MyClass : public Interface, public Component
{};

...
...
Interface* p = new MyClass(); p.method();

Идея заключается в том, что чистая виртуальная функция, унаследованная от Interface, реализована в MyClass посредством наследования Component. Это не компилируется; Мне нужно сделать это:

class MyClass : public Interface, public Component
{
public:
void method(){Component::method();} override
};

Можно ли как-то избежать явного переопределения и делегирования в Компонент, возможно, с помощью шаблонов каким-то образом?

1

Решение

Если вы хотите избежать явного переопределения и делегирования компоненту, нет никакого способа унаследовать какой-либо класс, производный от интерфейса, который выполняет эту привязку, потому что то, что вы хотите вызвать, должно в конечном итоге попасть в vtable вашего производного класса.

Я думаю, вы могли бы заставить его работать с алмазоподобной структурой наследования и виртуальным наследованием, но это не совсем красиво:

class Interface
{
public:
virtual void method()=0;
};

class Component: virtual public Interface
{
public:
virtual void method(){ /*do something*/};
};class MyClass : virtual public Interface, private Component
{
public:
using Component::method;
};

Обычный отказ от ответственности: виртуальное наследование дорого

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]