Qu'est-ce qu'une fonction virtuelle?
Une fonction virtuelle est une fonction, définie dans une superclasse, qui doit être présente dans une sous-classe pour que cette sous-classe ait une définition complète de classe. Les fonctions virtuelles reposent sur un paradigme de programmation orienté objet appelé héritage virtuel, qui est le plus souvent visible en C ++ en utilisant le mot-clé "virtuel". Pour définir une fonction virtuelle, deux classes sont nécessaires, une superclasse et une sous-classe. La superclasse est l'endroit où la fonction est déclarée pour la première fois, et éventuellement définie. La sous-classe est l'endroit où la fonction est définie - ou remplacée, selon que la fonction a été définie dans la superclasse.
La fonction virtuelle peut être définie de deux manières. Premièrement, il peut être défini comme un talon, dans lequel il a un corps vide et ne fait rien. Deuxièmement, il pourrait être défini comme une fonction virtuelle pure, où il est défini comme null dans le fichier d'en-tête du superclasse.
Il y a des avantages et des inconvénients aux deux méthodologies. Définir une fonction comme un talon garantit que toutes les sous-classes HAen une certaine implémentation, même si cela ne fait rien. Si l'on oublie de remplacer la fonction et de l'implémenter correctement dans une sous-classe, cependant, aucune erreur ou avertisseur ne semblera le souligner. La définition d'une fonction virtuelle pure, en revanche, nécessite que chaque sous-classe ait sa propre définition de la fonction, et les erreurs apparaîtront si ce n'est pas le cas.
Les fonctions virtuelles, cependant, sont soumises aux mêmes règles d'héritage que les fonctions non virtuelles, de sorte que les hiérarchies d'héritage avec plus de deux niveaux peuvent ne pas nécessiter des définitions explicites des fonctions virtuelles. Par exemple, on peut considérer une classe A qui déclare une fonction virtuelle, qui est implémentée dans la sous-classe B. La classe B a une sous-classe propre, la classe C. Classe C ne nécessite pas de définition explicite de la fonction de la classe A, car elle hérite de la définition de la classe B. Si nécessaire, la classe C pourrait remplacer la fonction de la classe B,ou il pourrait remplacer la fonction de la classe B tout en l'appelant également.
À l'autre extrême, les fonctions virtuelles ne doivent pas être définies dans une sous-classe si elles sont déclarées virtuelles dans cette sous-classe. Par exemple, on peut considérer une classe A qui déclare une fonction virtuelle et a deux sous-classes, B et C. De plus, on pourrait imaginer que la classe B a des sous-classes D et E, et la sous-classe C a des sous-classes F et G.
Les classes B à G doivent tous avoir la fonction virtuelle de la classe A définie d'une manière ou d'une autre. Si la classe B a une implémentation de la fonction de A, les classes D et E n'ont pas besoin de refuser. Peut-être que les sous-classes de C doivent implémenter la fonction de A, mais elles font toutes les deux quelque chose de différent, donc définir la fonction de la classe C elle-même ne serait pas utile. Dans ce cas, la fonction peut être déclarée virtuelle dans la classe C, et une implémentation n'est pas nécessaire.
Les fonctions virtuelles peuvent être intimidantes à apprendre, mais lorsqu'elles sont utilisées correctement, elles peuvent réduire la duplication du code et rendre le code beaucoup plus facile à comprendreen général. Il existe cependant de nombreux pièges avec des fonctions virtuelles, en particulier concernant l'héritage multiple. En héritage multiple, il est possible que les fonctions virtuelles définies ambiguës entrent en conflit entre elles, de sorte qu'elles doivent être utilisées avec prudence dans ce contexte.