En informatique, l’héritage multiple est un mécanisme de programmation orientée objet dans lequel une classe peut hériter de comportements et de fonctionnalités de plus d'une super-classe. Il s'oppose à l'héritage simple, dans lequel une classe ne peut hériter que d'une seule super-classe.
Il est supporté par certains langages de programmation, par exemple C++, Eiffel ou Python. Pouvant poser des problèmes, d’autres langages comme Ada, C#, Fortran, Java, Objective-C, Ruby, Swift ou Visual Basic ont préféré ne pas le proposer directement.
Utilité
L'héritage multiple sert à combiner les comportements de plusieurs classes.
Selon B. Stroustrup[1], l'inventeur du langage C++, ce mécanisme est facultatif parce que les problèmes qu'il résout peuvent être résolus par d'autres moyens.
Problèmes
L'héritage multiple génère parfois des erreurs de compilation.
Le principal problème rencontré est la présence de différentes implémentations par les super-classes d'une certaine classe pour une même déclaration. Ce problème est aussi connu sous le nom du problème du diamant.
Un autre problème est la compilation de classes à héritage multiple. En effet, lorsqu'une méthode polymorphique est appelée, il faut déduire la bonne implémentation à exécuter. Si la méthode est le résultat d'un héritage simple, elle n'a alors qu'une seule implémentation possible, et il ne sera donc pas difficile retrouver l'implémentation. Si la méthode est le résultat d'un héritage multiple, elle a alors plusieurs implémentations possibles. Il faut donc choisir l'une des implémentations concurrentes. C'est problématique car différentes implémentations peuvent avoir des effets de bord différents, résultant donc en un comportement indéfini (undefined behavior).
La compilation d'une classe à héritage multiple n'est par contre pas nécessairement moins efficace que la compilation d'une classe à héritage simple[réf. nécessaire].
Solutions
Priorisation
Eiffel et Python proposent de prioriser les méthodes, indiquant lors de la déclaration d'héritage quelle méthode prendre dans les situations de polymorphisme en cas de conflit.
Méthodes virtuelles
Une méthode virtuelle, ou encore « méthode polymorphique » est une méthode destinée à pouvoir être redéfinie dans les sous-classes de la classe de celle-ci.
On en retrouve dans plusieurs langages orientés objet.
Interfaces
Une interface est une classe complètement abstraite, c'est-à-dire qu'elle propose la déclaration de fonctionnalités tout en empêchant leur définition.
On en retrouve notamment en Java, en Delphi, en C# et en Visual Basic. Dans ces langages, une classe ne peut hériter que d'une seule super-classe et peut implémenter plusieurs super-interfaces.
Mixins
Un mixin est exclusivement une super-classe. En d'autres mots, un mixin est une classe servant exclusivement à être hérité.
Traits
Un trait est un mixin qui rend impossible les collisions causés par l'héritage multiple.
On en retrouve notamment en Scala et en PHP.
Notes et références
Voir aussi