interface — Использование наследования от конкретного класса для реализации чисто виртуального метода Stack Overflow

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

class InterfaceA{
public:
virtual void foo() = 0;
};

class InterfaceB:public InterfaceA{
public:
virtual void bar() = 0;
};

class ConcreteA : public InterfaceA{
public:
virtual void foo(){}//implements foo() from interface
};

class ConcreteAB: public InterfaceB, public ConcreteA{
public:
virtual void bar(){}//implements bar() from interface
};

В этом сценарии компилятор запрашивает реализацию foo () в классе ConcreteAB, потому что InterfaceB не имеет его реализованного и унаследованного от InterfaceA.

Есть ли способ сказать компилятору использовать реализацию из ConcreteA без использования оболочки, вызывающей ConcreteA :: foo ()?

2

Решение

Делать InterfaceA виртуальный базовый класс.

class InterfaceB : public virtual InterfaceA {
public:
virtual void bar() = 0;
};

class ConcreteA : public virtual InterfaceA {
public:
virtual void foo(){}//implements foo() from interface
};
4

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

Тебе нужно виртуальное наследство.

Интерфейс А, находящийся на вершине иерархии, должен наследоваться практически всеми непосредственными подклассами.

class InterfaceB:public virtual InterfaceA{
public:
virtual void bar() = 0;
};

class ConcreteA : public virtual InterfaceA{
public:
virtual void foo(){}//implements foo() from interface
};
3

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