2010-03-27 3 views
4

j'ai lu sur l'héritage multipleest l'héritage multiple un problème de rédacteurs de compilateur? - 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

Mais puisque le code ne compile pas jusqu'à ce que l'ambiguïté est résolue, ne pas faire l'héritage multiple un problème pour les rédacteurs de compilateurs seulement? - comment ce problème m'affecte-t-il au cas où je ne veux jamais coder un compilateur?

Répondre

4

Si vous voulez écrire du code qui compile, vous devez savoir quels types de problèmes peuvent provoquer sa non-compilation et comment éviter ces situations. C'est votre problème, en tant qu'utilisateur du compilateur, de concevoir vos hiérarchies d'héritage de manière à ce qu'elles soient compilables. De plus, si vous ne comprenez pas comment fonctionne l'héritage multiple, vous pourriez avoir de fausses suppositions sur ce que font exactement vos classes. Si les classes se comportent différemment de ce que vous attendez, cela causera des bogues lorsque vous essaierez de les utiliser.

0

En général, oui, vous frappez le clou sur la tête. Cela augmente considérablement la complexité et l'effort impliqués dans la maintenance du compilateur, mais pour le programmeur, cela ne fait qu'ajouter une petite quantité de complexité supplémentaire, la plupart du temps liée à la nécessité d'être fastidieusement spécifique si un problème de diamant survient. (Ce qui devrait être très rare dans une hiérarchie d'objets bien conçue.)

1

Le rédacteur du compilateur affichera un message d'erreur désagréable et arrêtera de compiler votre code si vous avez une ambiguïté non résolue en raison de l'héritage multiple. Quand ils disent que le code ne compilera pas jusqu'à ce que l'ambiguïté soit résolue, vous devez prendre en compte plusieurs problèmes:

  1. Vous n'avez pas de programme de travail tant que l'ambiguïté n'est pas résolue.
  2. Le compilateur ne le résout pas pour vous. Par conséquent, jusqu'à ce que vous le résolviez, c'est votre problème, pas le rédacteur du compilateur.
1

Non, ce ne est pas un problème pour un écrivain du compilateur:

  • En général, un écrivain du compilateur pourrait être en train de définir la façon dont plusieurs œuvres d'héritage.
  • Spécifiquement pour C++, il existe plusieurs solutions à mettre en œuvre par l'enregistreur.

C'est un problème pour le programmeur C++, mais seulement si vous ne comprenez pas comment fonctionne MI en C++. J'ai une solution générale qui consiste à avoir une classe de base qui définit une interface publique - que vous considérez alors comme ayant des sous-sections distinctes, que vous implémentez ensuite comme des classes abstraites distinctes, qui sont héritées par une classe de feuille concrète :

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

Chacun A, B et C mettre en œuvre sous-sections qui ne se chevauchent de base, ce qui signifie que vous pouvez permuter, disons A, A » pour un autre ou l'amélioration de la mise en œuvre sans affecter toute autre classe.