Herencia múltiple sin funciones virtuales en c ++

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'.

Según la estructura: sí, quiero tener varias 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 las funciones get / set para cada capa media 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 {};

Access val en la clase padre ahora funciona 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 val a través de:

world* w = new world;
w->country1::kid1::val=1; // error

resultados en:

error: ‘kid1’ is an ambiguous base of ‘world’

¿Por qué? ¿No está bien definida la ruta al valor?

Respuestas a la pregunta(2)

Su respuesta a la pregunta