Chapitre 6 : Polymorphisme
Niveau : 2A / 2P
Equipe C++
Enseignante :
Mme Soumaya Argoubi
Année universitaire :2023-2024
1
Plan du chapitre
Introduction
Héritage de type
Résolution statique des liens
Méthodes virtuelles et virtuelles pures
Résolution dynamique des liens
Collection d’objets polymorphes
Classes abstraites
Résumé
28/04/2020 2
Introduction
• Définitions:
⮚ Le mot polymorphisme vient du Grec et décrit ce qui peut prendre plusieurs
formes.
⮚ En informatique c’est un concept orienté objet qui permet au programmeur de
manipuler différentes formes d'une même classe d’une façon unique.
⮚ Donc, il permet de faire une abstraction des détails relatives aux classes dérivées
d’une classe mère.
3
Introduction
• Exemple :
▪ La classe Etudiant hérite de la classe Personne 🡺
Etudiant est une forme de Personne.
Classe Personne
Etudiant E;
Héritage
▪ E peut être manipulé soit comme :
Classe Etudiant ✔ Un objet de la classe Etudiant.
✔ Un objet de la classe Personne.
4
Héritage de type
Personne
Personne P; Correct, mais seule la partie « Personne » de E fait l'objet de
Etudiant E; l'affectation : les attributs CIN, nom et prenom. # CIN
🡺 Perte d’information (attributs classe et moyenne) # nom
P = E; # prenom
E = P; Incorrect, une Personne n'est pas forcément un Etudiant.
Les attributs classe et moyenne resteront sans affectation !!
Héritage
Personne* ptrPerso = &P;
ptrPerso = &E; Etudiant
- classe
ptrEtd doit contenir l’adresse d’un objet de la - moyenne
classe Etudiant.
Etudiant* ptrEtd = &P; P est un objet de la classe Personne et n'est pas,
donc, forcément un Etudiant.
5
Résolution Statique des liens
En C++, par défaut,
il y a une
résolution statique
des liens
Laquelle des deux méthodes
« afficher() » sera appelée lors
de l’exécution ?
28/04/2020 6
Résolution Dynamique des liens
⮚ Le polymorphisme représente la capacité du système à choisir dynamiquement la
méthode qui correspond au type de l’objet en cours de manipulation.
🡺 La résolution dynamique des liens
• Si on désire que la méthode appelée sera celle de la classe Etudiant, il faut autoriser
la résolution dynamique des liens !
• Le choix de la méthode à exécuter sera selon le type réel de l’objet manipulé.
• 2 conditions nécessaires : Références + Méthodes Virtuelles
?
28/04/2020 7
Méthodes virtuelles et virtuelles pures
1- Méthodes Virtuelles:
• Une méthode virtuelle est une méthode qui peut être redéfini dans une classe
fille.
• Toute redéfinition d’une méthode virtuelle dans une sous classe sera
automatiquement virtuelle.
🡺 Ce n’est pas obligatoire d’écrire le mot clé « virtual » aux niveaux des classes
dérivées.
• virtual Type nom_fonction (arguments) [const] ;
• Exemple : class A
{
virtual void afficher() const { cout << ’A’ << endl; }
}; 8
Méthodes virtuelles et virtuelles pures
2- Méthodes Virtuelles pures:
• Une méthode est dite virtuelle pure, ou abstraite, si elle n’a pas de « corps ».
• Exemple: La méthode surface () dans une Classe FormeGeo.
• On connait la surface d’un cercle, un rectangle, un triangle mais on ne peut pas définir la
surface d’une forme géométrique en générale.
🡺 la méthode surface () est une méthode abstraite.
• virtual TypeDeRetour nomMethode (types et liste d’arguments) = 0;
28/04/2020 9
Classes abstraites
• C’est une classe qui a au moins une méthode virtuelle pure.
• Elle ne peut pas être instanciée.
• Toutes ses classes filles restent abstraites tant qu’elles ne définissent pas toutes
les méthodes virtuelles pures qu’elles héritent.
🡺Exemple : La classe FormeGeo sera une classe abstraite.
28/04/2020 10
Revenons à notre exemple !
Comment résoudre ce
problème pour faire appel à la
méthode afficher() de la classe
Etudiant ?
28/04/2020 11
Résolution Dynamique des liens
12
Résolution Dynamique des liens
Personne *P = new Etudiant();
delete P; Appel: Destructeur Personne Appel: Destructeur Etudiant
uniquement. puis Destructeur Personne
13
Résolution Dynamique des liens
• Le destructeur d’une classe peut être défini comme virtuel.
• Utilité : Détruire un objet d’une classe fille qui est référencé par un pointeur de
la classe mère.
• Conséquence : Si le destructeur est virtuel, il y aura exécution du destructeur
de la classe fille puis celui de la classe mère. Sinon seul le destructeur de la
classe de mère est appelé.
28/04/2020 14
Collection d’objets polymorphes
• Exemple : ▪ Si on a une collection contenant des objets instanciés de
plusieurs classes qui héritent de la classe Personne, on
P peut manipuler tous ces objets de la même manière car ils
Personne sont tous des objets de la même super classe.
TabPerso.push_back(E);
Héritage
▪ Vector <Personne> TabPerso;
🡺Résolution statique des
E liens
Etudiant Enseignant ▪ Vector <Personne * > TabPerso;
TabPerso.push_back(&E);
+ Méthode(s) virtuelle(s)
28/04/2020 🡺Résolution dynamique des liens 15
Collection d’objets polymorphes
🡺 Manipulation homogène de différentes instances d’une hiérarchie commune bien
que leurs comportements sont distincts.
🡺 C’est l’une des utilisations les plus fréquentes du Polymorphisme.
28/04/2020 16
A retenir
⮚ Un objet polymorphe est un objet susceptible de prendre plusieurs formes
pendant l’exécution.
⮚ La notion de polymorphisme n’a de sens que dans un contexte d’héritage.
⮚ Une classe fille hérite les attributs, les méthodes et le type de sa classe mère.
⮚ Une méthode virtuelle est une méthode qui sera redéfinie par une ou plusieurs
classes filles. (expl: la méthode afficher() et le destructeur)
⮚ Résolution dynamique des liens : Référence + Méthode virtuelle.
⮚ Une collection d’objets polymorphes permet de manipuler différentes instances
d’une hiérarchie commune de la même façon.
⮚ Une classe abstraite est une classe qui a au moins une méthode virtuelle pure.
28/04/2020 17
Bibliographie & Netographie
• Cours de C/C++, Christian Casteyde.
28/04/2020 18
TD 6
28/04/2020 19