Подкласс C ++, производный от классов, производных от того же класса - PullRequest
1 голос
/ 05 января 2011

Почему следующая структура наследования недопустима в C ++?

  • Сын1 происходит от Отца1
  • Сын2 происходит от Отца1
  • GrandSon1 происходит от Son1 и Son2

Если может быть случай, когда это законно (возможно, если все классы являются чисто виртуальными, за исключением GrandSon1), каковы они и как это происходит?

Ответы [ 5 ]

7 голосов
/ 05 января 2011

Вы не правы, это совершенно законно в C ++.Вы можете посмотреть на виртуальное наследование .

3 голосов
/ 05 января 2011

Эта иерархия наследования называется алмаз смерти , и это допустимо в C ++, если вы используете виртуальное наследование, хотя обычно это все еще проблематично.

1 голос
/ 05 января 2011

Это типичное наследство алмаза.Это происходит даже в стандартной библиотеке, где iostream происходит как от istream, так и от ostream, и оба они происходят из ios_base.

Существуют различные проблемы:

  • Если у отца естьвиртуальный метод, и Son1 и Son2 реализуют его, если только Grandson не реализует его тоже, он должен указать, какой из методов Son1 и Son2 он реализует.

  • Если у отца есть какие-либо элементы данных, Grandsonих дважды.

  • В любом случае у отца есть v-таблица, так что вы, похоже, получаете 2 копии этого.

Поэтому средние классыобычно используют виртуальное наследование, что сложно, но эффективно означает, что только конечный класс получает базовый класс.Таким образом, в этом случае сам внук отвечает за создание Отца и, как предполагается, «имеет» его.

Существуют и другие вопросы, которые следует остерегаться, если вы собираетесь использовать какие-либо указатели.Особенно будьте осторожны при наведении в пустоту и из нее *.

1 голос
/ 05 января 2011

Это проблема C ++ Diamond.

См .: http://en.wikipedia.org/wiki/Diamond_problem

0 голосов
/ 05 января 2011

Мне кажется, вы путаете иерархию классов и экземпляр класса.

класс "внука" может быть производным от класса "сын", но экземпляр "внука" не может быть из 2 экземпляров класса "сын"

В любом случае, я думаю, что вы не должны делать это так, потому что в какой-то момент у вас будет класс "внука" и класс "внука".

Установить отношения между родителями и братьями и сестрами по-другому.

...