Я столкнулся с проблемой бриллианта и нашел разные решения для разных случаев с одним бриллиантом. Однако я не смог найти решение для «цепных» бриллиантов.
Согласно структуре: да, я хочу каждый раз иметь несколько базовых классов, поэтому виртуальное наследование не является решением (тогда оно вообще называется бриллиантом?). Я также хотел избежать функций get/set для каждого среднего слоя алмаза.
p p
| |
k k
\ /
s
class parent { int val; };
class kid1 : public parent {};
class kid2 : public parent {};
class school : public kid1, public kid2 {};
Доступ к val в родительском классе теперь работает следующим образом:
school* s = new school;
s->kid1::val=1; // works
Но как насчет следующего «цепного» бриллианта:
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 {};
Доступ к val через:
world* w = new world;
w->country1::kid1::val=1; // error
приводит к:
error: ‘kid1’ is an ambiguous base of ‘world’
Почему? Разве путь к значению не определен?
school : kid
нарушает LSP. По крайней мере, я никогда не был в школе, где было двое детей :) - person fredoverflow   schedule 18.03.2011