« Programmation C++/Polymorphisme » : différence entre les versions

Contenu supprimé Contenu ajouté
Merrheim (discussion | contributions)
Aucun résumé des modifications
 
Création
Ligne 1 :
{{Programmation C++}}
==Polymorphisme==
 
<!-- Note d'édition : ne pas confondre avec la surcharge, où les fonctions peuvent avoir un même nom, mais différents types de paramètres -->
 
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).
 
==Exemple==
 
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 <tt>sort</tt> effectue le tri du tableau en appelant la méthode <tt>compare</tt>.
 
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==
 
Si on a un tableau de pointeur sur des objets B, la méthode <tt>compare</tt> 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==
 
Pour que la méthode appelée soit celle de la classe B, il faut qu'elle soit déclarée virtuelle (<tt>virtual</tt>) 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 appelera 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.