Programmation Orientée objet en C++
Chapitre 1. 1 Vocabulaire
Chapitre 2. 2 Principes de la programmation objet
Chapitre 3. 3 Du C au C++
Chapitre 4. 4 Les classes
4.1. Entête dans le .hpp
4.2. Définition dans le .cpp
4.3. Instanciation et Utilisation
4.4. Utilisation avec des pointeurs
4.5. Fonctions
4.6. Constructeurs/Destructeurs
4.7. Objets utilisés en paramètres, en retour
4.8. Adresse d'un objet : this
4.9. Constructeur par recopie
4.10. Objets contenant d'autres objets
4.11. Surcharge/Surdéfinition d'opérateurs
4.12. Héritage
Home pageContentsHigher levelPrevious page Bottom of page

Polymorphisme

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)

 


Home pageContentsHigher levelPrevious pageTop of pageFollowing page