Qu'est-ce que l'héritage virtuel?
L'héritage virtuel est un type d'héritage dans lequel l'implémentation d'une superclasse est incomplète et une sous-classe est requise pour la définition complète d'un objet. Ce type d'héritage peut être utilisé avec l'héritage simple ou multiple, mais il est le plus souvent utilisé dans l'héritage multiple. Toute classe qui hérite d'une classe de base virtuelle devient une sous-classe directe de cette classe de base. Une classe de base virtuelle peut s’appuyer sur une sous-classe pour implémenter toutes ses méthodes, mais cela n’est pas obligatoire.
C ++ est le langage informatique le plus connu pour utiliser l'héritage virtuel. Pour déclarer un héritage virtuel en C ++, le mot clé "virtual" est utilisé. La superclasse et la sous-classe doivent déclarer des méthodes virtuelles avec le mot clé "virtual". Cela indique au compilateur C ++ que la superclasse est incomplète et qu'il doit obtenir des informations de la sous-classe pour la compléter. L'utilisation de la sous-classe pour compléter la super-classe ne signifie pas que les sous-classes se écrasent si elles ont la même classe de base. Au lieu de cela, le compilateur C ++ s'occupe de déterminer quelles parties vont avec chaque objet.
Puisqu'une classe de base virtuelle est requise pour l'héritage virtuel, les fonctions globales en C ++ ne peuvent pas être déclarées virtuelles. Ce type d'héritage ne peut être utilisé que si vous adhérez aux principes de la programmation orientée objet (OOP). La raison en est que les fonctions globales ne sont pas associées à une classe particulière et sont donc généralement autonomes. Sans une superclasse et une sous-classe, l'héritage ne peut pas se produire, donc les fonctions globales et l'héritage virtuel s'excluent mutuellement. Les fonctions globales peuvent, en théorie, être utilisées dans des fonctions virtuelles, mais l'inverse peut ne pas toujours fonctionner.
L'héritage virtuel est utilisé pour résoudre de nombreux problèmes de programmation. L'un des plus utiles est la résolution de l'ambiguïté. Dans l'héritage multiple, on peut avoir une classe de base A qui a deux sous-classes, B et C, puis une classe D qui hérite des classes B et C. Ce modèle est communément appelé le "diamant de la mort", car si la classe A, B et C ont tous des implémentations de la même méthode, il n'est pas possible pour la classe D de déterminer quelle implémentation elle devrait utiliser. L'héritage virtuel résout ce problème car l'implémentation de chaque classe reste distincte et donc non ambiguë. Cette distinction est gérée par des objets internes spécialisés appelés tables virtuelles (vtables) qui gardent une trace de chaque type d'objet, mais ces tables n'ont pas besoin d'être explicitement manipulées par un programmeur car elles sont intégrées au langage.