2010-03-27 3 views
4

я читал о множественном наследовании- это множественное наследование проблемы с компиляторами? - C++

What is the exact problem with multiple inheritance? http://en.wikipedia.org/wiki/Diamond_problem

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

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

ответ

4

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

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

0

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

1

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

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

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

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

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

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

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

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

Смежные вопросы