Qu'est-ce que l'héritage virtuel?
L'héritage virtuel est un type d'héritage dans lequel la mise en œuvre d'une superclasse est incomplète, et une sous-classe est requise pour une définition complète d'un objet. Ce type d'héritage peut être utilisé en conjonction avec l'héritage unique et multiple, mais 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 ce n'est pas une exigence.
C ++ est le langage informatique le plus connu pour utiliser l'héritage virtuel. Pour déclarer l'héritage virtuel en C ++, le mot-clé "virtuel" est utilisé. La superclasse et la sous-classe doivent déclarer des méthodes virtuelles avec le mot-clé "virtuel". Cela indique au compilateur C ++ que la superclasse est incomplète, et il doit obtenir des informations de la sous-classe pour la compléter. L'utilisation de la sous-classe pour terminer la superclasse ne signifie pas que les sous-classes se remplacent s'ils ont leMême classe de base, et au lieu de cela le compilateur C ++ s'occupe de déterminer quelles pièces vont avec chaque objet.
Étant donné qu'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 lors de l'adhésion aux principes de 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 un héritage de superclasse et de sous-classe 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 à l'intérieur des fonctions virtuelles, mais l'inverse ne fonctionne pas toujours.
L'héritage virtuel est utilisé pour résoudre de nombreux problèmes de programmation, et l'un des plus utiles est la résolution de l'ambiguïté. En héritage multiple, on peut avoir une classe A de base A qui a deux sous-classes, B etC, puis une classe D qui hérite des classes B et C. Ce modèle est communément appelé "Diamond of Death" car si les classes A, B et C ont toutes des implémentations de la même méthode, il n'est pas possible pour la classe D de déterminer quelle implémentation il devrait utiliser. L'héritage virtuel résout ce problème car la mise en œuvre de chaque classe reste distincte et donc sans ambiguïté. Cette distinction est gérée par des objets internes spécialisés appelés tables virtuelles (VTABL) qui gardent une trace de chaque type d'objet, mais ces tableaux n'ont pas besoin d'être manipulés explicitement par un programmeur car ils sont intégrés dans la langue.