2. Le polymorphisme
1. Définition et intérêt
2. Liaison statique
3. Liaison dynamique
4. Méthode virtuelle pure
5. Classe abstraite
3. Définition et intérêt
• Le polymorphisme désigne la faculté pour un pointeur, une
référence, un opérateur ou une méthode de se comporter
différemment suivant le contexte.
• Le polymorphisme permet de manipuler d’une façon
uniforme un ensemble d’objets appartenant à une même
hiérarchie de classes
4. Liaison statique
• Connecter un appel de fonction à un corps de fonction est
appelé liaison (ou binding en anglais)
• Quand la liaison est effectuée avant que le programme ne soit
exécuté, elle est appelée liaison statique ( ou early binding).
• Avec une liaison statique, l’appel d’une méthode pour un objet
pointé conduit à invoquer la méthode correspondant au type du
pointeur, et non pas au type effectif de l’objet pointé.
5. Liaison dynamique
• La liaison dynamique est le mécanisme qui lie le corps de la
fonction lors de l’exécution.
• Avec une liaison dynamique, l’appel d’une méthode pour un
objet pointé conduit à appeler la méthode correspondant au
type effectif de l’objet pointé.
• C++ utilisant par défaut la liaison statique, toute méthode à
liaison dynamique doit être explicitement signalée.
• Utiliser le mot-clef virtual devant la déclaration de la méthode
à liaison dynamique (appelée aussi méthode virtuelle).
• Ce mot-clef ne doit pas être utilisé devant la définition de la
méthode, ni devant les redéfinitions dans les sous-classes.
6. Méthode virtuelle pure
• Certaines méthodes sont « trop » générales pour pouvoir être
implémentées.
• Exemple : un cercle et un rectangle ont tous une aire, mais la
méthode de calcul est différente d’une figure à l’autre.
• Solution : déclarer la méthode aire() dans la classe parente
Figure sans lui donner d’implémentation.
• Syntaxe de la déclaration d’une méthode virtuelle pure :
virtual <typeDeRetour> <nomMéthode>(<arg>) = 0;
7. Classe abstraite
• Toute classe contenant (au moins) une méthode virtuelle pure
est appelée classe abstraite.
• Une classe abstraite ne peut être instanciée.
• Toute classe non abstraite dérivant d’une classe abstraite doit
implémenter toutes les méthodes virtuelles pures.