Tengo una estructura de clase mucho más complicada que esta, pero reduciendo el problema a su esencia, esto describe mi escenario: Tengo dos clases, A & B, que implementan clases básicas virtuales puras que comparten un ancestro común, y luego una tercera clase C que com-postula una & B. por último, una clase de plantilla que llena en los métodos comunes en la base virtual pura:Herencia ambigua de clases base abstractas:
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();
Mi problema es, que pueda No veo ninguna forma de hacer que C :: q llame a 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.
}
¿Cómo puedo llamar al método r() desde C para que se llame al método virtual correcto?
Disculpa, debería haber aclarado que la herencia virtual no se puede utilizar aquí. He encontrado dos soluciones:
struct C : A, B {
virtual void r()=0;
...
O
struct C : A, B {
using A::r;
...
Ambos parecen eliminar la ambigüedad de la llamada a la r() lo suficiente para que todo se resuelve.
+1 por tomar su problema y descomponerlo en su forma más simple. –
¿No es r() va a ser ambiguo en C sin herencia virtual? – DumbCoder
¿Quisiste decir clase base virtual o simplemente clase base abstracta?Porque para hacer que 'I' sea una base virtual necesita' struct A: virtual I {}; 'y' struct B: virtual I {}; '. –