Множественное наследование без виртуальных функций в С++
Я столкнулся с проблемой алмаза и нашел разные решения для разных случаев с одним алмазом. Однако я не мог найти решение для "цепных" бриллиантов.
В соответствии со структурой: да, я хочу иметь несколько базовых очков каждый раз, поэтому виртуальное наследование не является решением (это еще называется алмаз?). Я также хотел избежать get/set-functions для каждого среднего слоя алмаза.
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’
Почему? Не определен ли маршрут к значению?
Ответы
Ответ 1
s->kid1::val
не означает "val
из подобъекта kid1
". Это просто имя, присвоенное типу (а не подобъекту), который содержит его.
Я не знаю, почему country1::kid1
даже принято вообще, но, по-видимому, это typedef для ::kid1
. Два элемента данных в world
оба имеют квалифицированное имя ::kid1::val
.
Что вы хотите:
world* w = new world;
country1* const c1 = world;
c1->kid1::val = 1;
Ответ 2
Это. Ошибка связана с ошибкой в вашем компиляторе.