Programmation C++/Polymorphisme

Polymorphisme

modifier

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.

Exemple

modifier

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
 };

Problème

modifier

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.

Solution

modifier

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.