У меня есть гораздо более сложная структура классов, чем эта, но кипящая проблема до ее сути, это описывает мой сценарий: у меня есть два класса: A и B, которые реализуют чистые виртуальные базовые классы, которые имеют общий предок, и затем третий класс C, который компилирует A и B. Наконец, класс шаблона, который заполняет общие методы в чистой виртуальной базе:
struct I {
virtual void r()=0;
};
struct A : I {};
struct B : I {};
struct C : A, B {
void q(){
r(); // the problem is here.
}
};
struct D : C {
virtual void r(){
}
};
C* c = new D;
c->q();
Моя проблема в том, что я не вижу никакого способа заставить C:: q вызвать r().
void C::q(){
r(); // is ambiguous
A::r(); // is pure virtual
B::r(); // also is pure virtual
D::r(); // C doesn't know about D
((D*)this)->r(); // is dubious and requires C to know about D.
}
Как я могу вызвать метод r() из C, чтобы вызвать правильный виртуальный метод?
Извините, я должен был уточнить, что виртуальное наследование нельзя использовать здесь. Я нашел два решения:
struct C : A, B {
virtual void r()=0;
...
ИЛИ
struct C : A, B {
using A::r;
...
Оба кажутся для того, чтобы все проблемы решались для устранения неоднозначности вызова r().