Dans le cas où une classe hérite de propriétés provenant de différentes classes, il est nécessaire de réaliser un héritage multiple, c'est à dire de donner à la classe dérivée plusieurs classes de base. L'utilisation de l'héritage multiple peut poser certains problèmes comme celui de l'ambiguïté des noms si plusieurs classes de base ont des membres ayant le même nom. Nous ne traitons ici que des aspects généraux de l'héritage multiple, notamment dans le cas où une classe de base apparaît plusieurs fois dans le graphe d'héritage (sans envisager tous les cas possibles d'erreur).
Dans le cas où une classe apparaît plusieurs fois dans le graphe d'héritage, il existe deux approches. Prenons un exemple:
Nous avons une classe A de laquelle dérivent les classes B et C et enfin une classe D dérivant de B et C.
Graphe d'héritage
La première approche consiste à créer cinq objets: un objet D, un objet B et un objet C, deux objets A - un pour l'objet B et un pour l'objet C.
Héritage multiple avec répétition des objets
La deuxième approche consiste à ne créer que quatre objets en identifiant les deux objets A précédents. Les objets B et C partagent donc alors le même objet de base. Cette approche est souvent plus proche de la conception naturelle de l'héritage.
Héritage multiple dans répétition des objets
L'héritage multiple avec répétition des objets est identique à l'héritage simple avec simplement l'ajout de plusieurs noms de classe de base.
L'héritage multiple sans répétition des objets est un peu plus complexe. Tout d'abord, les classes B et C partageant le même objet de base A, cela enfreint le paradigme de la protection des données. Il faut donc préciser dans les classes B et C que l'on autorise ce partage. Cela se fait en ajoutant le mot clé virtual à la définition de la dérivation:
D'autre part comme il n'existe qu'un objet A, il est possible, dans le cas où l'on a un constructeur autre que celui par défaut, que les informations passées à ce constructeur par ceux de B et de C soient contradictoires. Il est donc nécessaire que ce soit le constructeur des objets de la classe D qui passe les informations pour la création de l'objet de base A. Le constructeur de la classe D est donc de la forme: