Aller au contenu

Programmation C++/Polymorphisme

Un livre de Wikilivres.

Le polymorphisme est une fonctionnalité de l'héritage : la capacité d'appeler une méthode en fonction du type réel d'un objet (sa classe).

 ne pas confondre avec la surcharge, où les fonctions peuvent avoir un même nom, mais différents types de paramètres.

Soit une classe A implémentée de la manière suivante :

 class A
 {
 public:
     int compare(A autre); // compare deux objets A
     static void sort(A** tableau_de_a,int nombre); // tri
 };

La méthode statique sort effectue le tri du tableau en appelant la méthode compare.

Soit une classe B héritant de A, ayant un critère supplémentaire de comparaison. Il faut donc une nouvelle version de la méthode de comparaison :

 class B : public A
 {
 public:
     int compare(A autre); // compare deux objets A
 };

Si on a un tableau de pointeur sur des objets B, la méthode compare appelée par la fonction de tri est celle de la classe A, car la fonction a pour paramètre un tableau de pointeur sur des objets A. Ce comportement n'est pas polymorphique.

Pour que la méthode appelée soit celle de la classe B, il faut qu'elle soit déclarée virtuelle (virtual) dans la classe de base :

 class A
 {
 public:
     '''virtual''' int compare(A autre); // compare deux objets A
     static void sort(A** tableau_de_a,int nombre); // tri
 };

La fonction de tri appellera alors la méthode selon le type réel des objets, même en utilisant un pointeur sur des objets A.

En fait, le compilateur construit une table des fonctions virtuelles pour les classes A et B et les autres sous-classes, et chaque objet créé possède un pointeur vers cette table.