Множественное наследование без виртуальных функций в c ++ - PullRequest
11 голосов
/ 18 марта 2011

Я столкнулся с проблемой алмазов и нашел разные решения для разных случаев с одним алмазом. Однако я не смог найти решение для «закованных» бриллиантов.

В соответствии со структурой: да, я хочу иметь несколько базовых классов каждый раз, поэтому виртуальное наследование не является решением (его даже тогда называют бриллиантом?). Я также хотел избежать функций 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’

Почему? Разве маршрут к значению не определен?

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

s->kid1::val не означает «val из подобъекта kid1». Это просто имя, определенное типом (не подобъектом), которое его содержит.

Я не знаю, почему country1::kid1 вообще принимается, но, очевидно, это typedef для ::kid1. Два элемента данных в world оба имеют полное имя ::kid1::val.

То, что вы хотите:

world* w = new world;
country1* const c1 = world;
c1->kid1::val = 1;
1 голос
/ 18 марта 2011

Это так. Ошибка связана с ошибкой в ​​вашем компиляторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...