Я хочу реализовать чисто виртуальные методы из интерфейса, используя реализацию
предоставляется конкретным классом без необходимости явного вызова метода из конкретного класса. Пример:
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 ()?
Делать InterfaceA
виртуальный базовый класс.
class InterfaceB : public virtual InterfaceA {
public:
virtual void bar() = 0;
};
class ConcreteA : public virtual InterfaceA {
public:
virtual void foo(){}//implements foo() from interface
};
Тебе нужно виртуальное наследство.
Интерфейс А, находящийся на вершине иерархии, должен наследоваться практически всеми непосредственными подклассами.
class InterfaceB:public virtual InterfaceA{
public:
virtual void bar() = 0;
};
class ConcreteA : public virtual InterfaceA{
public:
virtual void foo(){}//implements foo() from interface
};