является ли множественное наследование проблемой авторов компиляции? - с ++ - PullRequest
4 голосов
/ 27 марта 2010

я читал о множественном наследовании

Какова точная проблема с множественным наследованием? http://en.wikipedia.org/wiki/Diamond_problem

http://en.wikipedia.org/wiki/Virtual_inheritance
http://en.wikipedia.org/wiki/Multiple_inheritance

Но поскольку код не компилируется до устранения неоднозначности, не делает ли это множественное наследование проблемой только для авторов компиляторов? - как эта проблема влияет на меня, если я не хочу когда-либо кодировать компилятор

Ответы [ 4 ]

4 голосов
/ 27 марта 2010

Если вы хотите написать код, который компилируется, вы должны знать, какие проблемы могут привести к его некомпиляции и как избежать таких ситуаций. Ваша задача как пользователя компилятора - спроектировать иерархии наследования таким образом, чтобы они были компилируемыми.

Также, если вы не понимаете, как работает множественное наследование, у вас могут быть неверные предположения о том, что именно делают ваши классы. Если классы ведут себя не так, как вы ожидаете, это приведет к ошибкам при попытке их использования.

1 голос
/ 27 марта 2010

Нет, это не проблема для автора компилятора:

  • В общем случае разработчик компилятора может определять, как работает множественное наследование.
  • Специально для C ++ существует несколько решений, которые может реализовать писатель.

Это проблема для программиста C ++, но только если вы не понимаете, как MI работает в C ++.

У меня есть одно общее решение, которое заключается в том, чтобы иметь базовый класс, который определяет общедоступный интерфейс - который вы затем рассматриваете как имеющий отдельные подразделы, которые затем реализуете как отдельные абстрактные классы, которые многократно наследуются конкретным листовым классом:

         ------
        | Base |
         ------
        |      |
         ------
           ^
           |
     -----------------
    |        |        |
 ------   ------   ------ 
|  A   | |  B   | |  C   |
 ------   ------   ------ 
|      | |      | |      |
 ------   ------   ------ 
    ^        ^        ^
    |        |        |
     -----------------
            |
          -------
         |Derived|
          -------
         |       |
          -------

Каждый из A, B и C реализует непересекающиеся подразделы Base, что означает, что вы можете заменить, скажем, A, на A 'для альтернативной или улучшенной реализации, не затрагивая какой-либо другой класс.

1 голос
/ 27 марта 2010

Автор компилятора напечатает неприятное сообщение об ошибке и прекратит компиляцию вашего кода, если у вас есть неразрешенная неопределенность из-за множественного наследования. Когда они говорят, что код не будет компилироваться, пока неоднозначность не будет устранена, вам нужно рассмотреть несколько вопросов:

  1. У вас нет работающей программы, пока не решена неоднозначность.
  2. Компилятор не разрешает это за вас.
  3. Поэтому, пока вы не решите ее, это ваша проблема, а не автор компилятора.
0 голосов
/ 27 марта 2010

В общем, да, ты бьёшь ногтем по голове. Это значительно увеличивает сложность и усилия, связанные с поддержкой компилятора, но для программиста это добавляет лишь небольшую дополнительную сложность, в основном связанную с необходимостью быть утомительно специфичным, если возникает проблема с алмазом. (Что должно быть очень редко в хорошо спроектированной иерархии объектов.)

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