Le C++ permet à des pointeurs d'une classe de base de pointer sur des objets d'une classe dérivée. Par exemple, si A est une classe de base et B une classe dérivée de A, il est possible de déclarer:
Cela est très pratique surtout pour stocker des objets. Il suffit en effet d'avoir un pointeur sur la classe de base car celui-ci peut pointer sur tout objet des classes dérivées. Cependant, comme le C++ possède un contrôle statique des types très contraignant, l'objet pointé ne pourra plus appeler que les méthodes de la classe de base. Cela limite l'utilité de ce stockage. Heureusement, le C++ offre une possibilité pour réduire ce problème: les fonctions virtuelles.
En fait, il existe deux façons pour appeler les bonnes méthodes:
1. insérer dans les objets une information sur leur type et, à l'aide de tests manuels, appeler les méthodes des bonnes classes. Ces appels se font de la manière suivante: nom_classe::méthode();
2. déclarer les méthodes virtuelles. Dans ce cas, il y aura à l'exécution la recherche du type effectif de l'objet pointé et appel de la bonne méthode.
La déclaration d'une méthode virtuelle se fait en ajoutant le mot clé virtual devant la déclaration de la méthode. Le programme cherchera alors à l'exécution, parmi les méthodes des classes dérivées ayant le même type de retour et des arguments de même type, celle qui appartient à la classe la plus proche de celle de l'objet appelant.
Les constructeurs et les fonctions amies ne peuvent pas être déclarés virtuels.
Supposons que l'on désire stocker plusieurs listes, avec ou sans répétition, à l'aide d'un tableau de pointeurs sur liste avec répétitions. Afin d'empêcher l'ajout de doublons dans les listes sans répétition, nous allons rendre la méthode ajoute virtuelle.
nous donne: