Alors que l’héritage permet la réutilisation
de code écrit pour une classe de base, le polymorphisme
permettra l'utilisation d'une même instruction pour
appeler dynamiquement des méthodes différentes
dans la hiérarchie des classes. Ceci est rendu possible
en C++ à l’aide de l’utilisation des
fonctions virtuelles.
Un objet d’une classe dérivée est objet
de la classe de base, pas le contraire. Ainsi un objet de
classe dérivée peut être utilisé
là où un objet de la classe mère peut
l’être.
Prenons le cas de la maClasse2 héritée de
maClasse1 (cliquez-ici).
Dans le premier cas, l’élément pointé
par ptr1 sera considéré comme étant
de la classe maClasse1 à cause de la déclaration
de ptr1, on ne pourra donc pas utiliser les méthodes
de maClasse2.
Si une méthode de la classe mère est redéfinie
dans la classe fille, c’est celle de la classe mère
qui sera utilisée (puisque le pointeur pointe sur
un objet de la classe maClasse1). Mais il est possible de
modifier ceci en déclarant la méthode comme
virtual dans la classe maClasse1. Ce mot clé indique
au compilateur que cette méthode peut être
redéfinie dans les classes dérivées
et qu’il faudra décider au moment de l’appel
au cours de l’exécution laquelle il convient
de choisir selon l’objet pointé. Tout ceci
ne peut bien évidemment marcher que dans le cas d’objets
dynamiques (impossible de faire ceci avec obj1 = obj2).
Pour déclarer une méthode virtuelle, voici
la syntaxe (exemple) :
virtual void maClasse : :
mafonction(paramètres) ;
Si dans la fonction traitement() nous voulons
appeler la méthode print( ) selon la classe
à laquelle appartient l'instance, nous devons définir,
dans la classe de base, la méthode print(
) comme étant virtuelle (exemple).
C’est ce comportement que l’on appelle le polymorphisme.
Lorsque le compilateur rencontre une méthode virtuelle,
il sait qu'il faut attendre l'exécution pour déterminer
la bonne méthode à appeler.
Lorsque l’on utilise des fonctions virtuelles, il
ne faut pas oublier d’également déclarer
le destructeur virtuel correspondant (un constructeur, par
contre, ne peut pas être déclaré comme
virtuel).
Il ne faut pas oublier de définir le destructeur
comme virtual lorsque l'on utilise une méthode virtuelle
(exemple)