next up previous contents
Next: Héritage sans partage Up: Héritage multiple Previous: Héritage multiple

L'héritage multiple en général

  figure573
Figure 5.2: les avions militaires ...

Si on considère un avion militaire, on peut supposer qu'il a les caractéristiques des avions mais aussi les caractéristiques du matériel militaire, dans ce sens on peut dire qu'un avion militaire est à la fois un avion et aussi matériel militaire, et donc que la classe des avions militaires hérite des classes avions mais aussi des classes matériel militaire.

Dans l'héritage multiple, l'ensemble des ancêtres d'une classe n'est plus nécessairement totalement ordonné, l'association d'un nom à sa définition n'est plus aussi simple. D'ailleurs les langages orientés objets n'adoptent pas tous la même stratégie. Une solution possible pourrait être d'ordonné la façon dont les classes héritent, et de choisir un ordre particulier entre les ancêtres et ainsi d'éviter toute ambiguïté.

Une autre solution, plus raisonnable et plus modulaire consiste à considérer toutes les linéarisations (c'est-à-dire les ordres totaux compatibles) de l'ordre partiel des ancêtres et pour chacune de ces linéarisations, d'associer à un nom la définition la plus proche dans cette linéarisation; si toutes ces associations correspondent à la même classe, on choira la définition de cette classe, dans les autres cas, on considérera qu'il y a ambiguïté (et on rejette).

   figure609
Figure 5.3: relation d'héritage

Dans la figurereffig2, f est associé sans ambiguïté à la définition de la classe D, car pour toutes les linéarisations, D est avant E, par contre, g est ambiguë, car par exemple, A B C D F G E est une linéarisation possible pour laquelle G est avant E, alors que A B C D E F G est une autre linéarisation avec E avant G. Le C++ avec la relation de domination choisit cette solution: en C++ un nom A::f domine un nom B::f si B est une classe de base pour A. En cas de ``domination'' il n'y a pas d'ambiguïté pour le C++. Dans l'exemple précédent, la classe D domine la classe F.

On peut aussi éviter les ambiguïtés par l'opérateur de portée ::.

Le choix de C++ est cohérent mais pose un problème, en effet cela signifie que quand on hérite d'une classe on doit connaître les noms des membres utilisés par les classes (alors même que peut-être on n'a pas le droit d'accès à ces membres...) et c'est donc un peu contradictoire avec la notion d'encapsulation. Rappelons pour finir, que tout ceci est dans le cas d'un langage compilé comme le C++ l'affaire du compilateur et donc n'apporte pas de pénalités à l'exécution.


next up previous contents
Next: Héritage sans partage Up: Héritage multiple Previous: Héritage multiple


Mon Oct 20 14:02:48 MET 1997