Как решаются проблемы совпадения имен и сигнатур методов при наследовании разных от интерфейсов?

Рассмотрим следующий код:

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

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

class C : public A, public B
{
public:
  void A::method() override
  {

  }
  void B::method() override
  {

  }
};

int main()
{
  C *c = new C();
  c->method();// ?
}

Скажите, пожалуйста, как решать подобные проблемы совпадения имен и сигнатур методов при наследовании от разных интерфейсов?


Ответы (2 шт):

Автор решения: Alex F
dynamic_cast<A*>(c)->method();
dynamic_cast<B*>(c)->method();

Или, для удобства:

A* pa = dynamic_cast<A*>(c);
B* pb = dynamic_cast<B*>(c);
...
pa->method();
pb->method();
→ Ссылка
Автор решения: AR Hovsepyan

Решается очень просто: для производного класса определяется метод, к которому можно обращаться также через указатель базового класса(любой из них).

class C : public A, public B
{
public:
    void method() override
    {            
       //ваш код
    }    
}; 

И теперь можно вызвать method ссылаясь на любой из этих классов:

int main()
{

    C* c = new C;
    c->method();// ?
    A* pa = c;
    B* pb = c;
    pa->method();
    pb->method();
    //или же по ссылке:
    A& a = *c;
    B& b = *(new C);
    a.method();
    b.method();
    // не забыть освобождать память
}
→ Ссылка