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 de classe complète. Les fonctions virtuelles reposent sur un paradigme de programmation orienté objet appelé héritage virtuel, généralement utilisé en C ++ à l'aide du mot clé "virtual". 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'abord déclarée 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 bout, 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 de la superclasse.

Les deux méthodologies présentent des avantages et des inconvénients. Définir une fonction en tant que souche garantit que toutes les sous-classes ont une implémentation, même si cela ne fait rien. Si on oublie de remplacer la fonction et de l’implémenter correctement dans une sous-classe, aucune erreur ni aucun avertissement ne semblera le signaler. Définir une fonction virtuelle pure, en revanche, requiert que chaque sous-classe ait sa propre définition de la fonction, et des 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. Par conséquent, les hiérarchies d'héritage avec plus de deux niveaux peuvent ne pas nécessiter de définitions explicites des fonctions virtuelles. Par exemple, on peut considérer une classe A qui déclare une fonction virtuelle implémentée dans la sous-classe B. La classe B possède sa propre sous-classe, la classe C. La classe C ne nécessite pas de définition explicite de la fonction de la classe A, car elle hérite la définition de la classe B. Si nécessaire, la classe C peut remplacer la fonction de la classe B, ou bien la fonction de la classe B tout en l'appelant.

À l'opposé, les fonctions virtuelles ne doivent pas nécessairement ê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 peut imaginer que la classe B a les sous-classes D et E, et que la sous-classe C a les sous-classes F et G.

Les classes B à G doivent toutes 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 d'être refaites. Les sous-classes de C doivent peut-être implémenter la fonction de A, mais elles font toutes les deux une chose différente. Par conséquent, définir la fonction dans 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 difficiles à apprendre, mais si elles sont utilisées correctement, elles peuvent réduire la duplication de code et rendre le code beaucoup plus facile à comprendre en général. Cependant, les fonctions virtuelles présentent de nombreux pièges, notamment en ce qui concerne l'héritage multiple. Dans l'héritage multiple, il est possible que des fonctions virtuelles définies de manière ambiguë soient en conflit, elles doivent donc être utilisées avec prudence dans ce contexte.

DANS D'AUTRES LANGUES

Cet article vous a‑t‑il été utile ? Merci pour les commentaires Merci pour les commentaires

Comment pouvons nous aider? Comment pouvons nous aider?