Я вступил в ту же проблему и случайно открыл вторую нить. Простите за это. Один из способов, который работал для меня, заключался в том, чтобы разрешить его без множественного наследования.
#include <stdio.h>
class A
{
public:
virtual void foo(void) = 0;
};
class B
{
public:
virtual void foo(void) = 0;
};
class C
{
class IA: public A
{
virtual void foo(void)
{
printf("IA::foo()\r\n");
}
};
class IB: public B
{
virtual void foo(void)
{
printf("IB::foo()\r\n");
}
};
IA m_A;
IB m_B;
public:
A* GetA(void)
{
return(&m_A);
}
B* GetB(void)
{
return(&m_B);
}
};
Трюк заключается в определении классов, полученных из интерфейсов (A и B), в качестве локальных классов (IA и IB) вместо использования множественное наследование. Кроме того, этот подход также открывает возможность иметь несколько реализаций каждого интерфейса, если это необходимо, что было бы невозможно с помощью множественного наследования. Локальным классам IA и IB может быть легко предоставлен доступ к классу C, поэтому реализации обоих интерфейсов IA и IB могут совместно использовать данные.
Доступ к каждому интерфейсу может быть выполнен следующим образом:
main()
{
C test;
test.GetA()->foo();
test.GetB()->foo();
}
... и нет никакой двусмысленности в отношении метода foo.