Herencia múltiple sin funciones virtuales en c ++
-
27-10-2019 - |
Pregunta
Me encontré con el problema del diamante y encontré diferentes soluciones para diferentes casos con un solo diamante.Sin embargo, no pude encontrar una solución para los diamantes "encadenados".
De acuerdo con la estructura: sí, quiero tener múltiples clases base cada vez, por lo que la herencia virtual no es una solución (¿se llama incluso diamante entonces?).También quería evitar get / set-functions para cada capa intermedia de un diamante.
p p
| |
k k
\ /
s
class parent { int val; };
class kid1 : public parent {};
class kid2 : public parent {};
class school : public kid1, public kid2 {};
Acceder a val en la clase principal funciona ahora de la siguiente manera:
school* s = new school;
s->kid1::val=1; // works
Pero, ¿qué pasa con el próximo diamante 'encadenado':
p p p p
| | | |
k k k k
\ / \ /
s s
| |
c c
\ /
w
class country1 : public school {};
class country2 : public school {};
class world : public country1, public country2 {};
Accediendo a val a través de:
world* w = new world;
w->country1::kid1::val=1; // error
da como resultado:
error: ‘kid1’ is an ambiguous base of ‘world’
¿Por qué?¿No está bien definida la ruta hacia el valor?
Solución
s->kid1::val
no significa "val
del subobjeto kid1
".Es solo un nombre calificado por el tipo (no el subobjeto) que lo contiene.
No sé por qué se acepta country1::kid1
, pero aparentemente es un typedef para ::kid1
.Dos miembros de datos en world
tienen el nombre calificado ::kid1::val
.
Lo que quieres es:
world* w = new world;
country1* const c1 = world;
c1->kid1::val = 1;
Otros consejos
Lo es.El error se debe a un error en su compilador.