Как решаются проблемы совпадения имен и сигнатур методов при наследовании разных от интерфейсов?
Рассмотрим следующий код:
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();
// не забыть освобождать память
}