Chapitre : Polymorphisme
1
Plan du chapitre
Introduction
Héritage de type
Résolution statique des liens
Résolution dynamique des liens
Méthodes virtuelles et virtuelles pures
Classes abstraites 2
16/10/2023 2
Introduction
Définitions:
C’est la possibilité pour un programmeur de traiter plusieurs formes d'une classe comme si
elles n'étaient qu'une.
Un mécanisme puissant d'abstraction qui protège les programmeurs des détails de
réalisation des classes dérivées (Programmation avancée en C++ - James O. Coplien).
A retenir:
Un objet polymorphe est un objet susceptible de prendre plusieurs formes pendant
l’exécution.
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
La notion de polymorphisme n’a de sens que dans un contexte d’héritage.
16/10/2023 3
Introduction
B objetB;
Classe A objetB peut être manipulé soit comme un objet de la
classe B, soit comme un objet de la classe A.
Si on a une collection contenant des objets instanciés
Héritage d’une ou plusieurs classe(s) qui hérite(nt) de la classe A,
on peut manipuler tous ces objets de la même manière
car ils sont tous des objets de la même super classe A.
Classe B
La manipulation de différentes instances d’une
hiérarchie commune est homogène bien que leurs
comportements sont distincts. D’où le concept de
Polymorphisme.
16/10/2023 4
Héritage de type
A a;
B b; // B est une classe derivee de A.
a = b; // correct, seule la partie A de b fait l'objet de l'affectation.
b = a; // incorrect, un A n'est pas un B.
A* pa = &a; // correct bien sur.
pa = &b; // correct aussi.
B* pb = &a; // erreur.
void fonction( A & objetA ) {...}
fontion( a ); // correct.
fontion( b ); // correct aussi.
16/10/2023 5
Résolution Statique des liens
class A class B : public A int main()
{ { {
void afficher() void afficher() A objetA;
{ cout << "A" << endl;} { cout << “B" << endl;} B objetB;
} } objetA= objetB;
[Link]();
}
Laquelle des deux méthodes afficher () sera appelé lors de l’exécusion ?
La méthode afficher () de la classe A sera appelée
En C++, par défaut, il y a une résolution statique des liens
16/10/2023 6
Résolution Statique des liens
16/10/2023 7
Résolution Dynamique des liens
Si on désire que la méthode appelée sera celle de la classe B, 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é.
Références + Méthodes Virtuelles
16/10/2023 8
Méthodes Virtuelles
En C++, pour que le compilateur considère qu’une méthode est virtuelle il faut la faire
précéder par le mot clé « virtual » lors de sa déclaration dans la classe la plus générale.
Toute redéfinition d’une méthode virtuelle dans une sous classe sera automatiquement
virtuelles.
Ce n’est pas obligatoire d’écrire le mot clé « virtual » aux niveaux des classes dérivées.
virtual Type nom_fonction (arguments) [const] ;
class A
{
virtual void afficher() const { cout << ’A’ << endl; }
};
16/10/2023 9
Méthodes Virtuelles
Le destructeur d’une classe peut être défini comme virtuel contrairement au
constructeur
Utilité : Détruire un objet d’une classe fille qui est référencé par un pointeur de la classe
de mère.
Conséquence : Si le destructeur est virtuel, il y aura exécution du destructeur de la classe
fille. Sinon seul le destructeur de la classe de mère est appelé.
16/10/2023 10
Méthodes Virtuelles
Personne *P = new Etudiant();
Appel: Destructeur Etudiant Appel: Destructeur Personne
delete P; puis Destructeur Personne uniquement.
16/10/2023 11
Exemple
16/10/2023 12
Méthodes virtuelles pures
Une méthode est dite virtuelle pure, ou abstraite, si elle n’a pas de « corps ».
Les sous-classes qui héritent de la classe où elle est écrite doivent la redéfinir.
Exemple: La méthode surface () dans une Classe FormeGeo.
On connais la surface d’une 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 ;
16/10/2023 13
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.
La classe FormeGeo sera une classe abstraite.
16/10/2023 14
Bibliographie & Netographie
Cours de C/C++, Christian Casteyde.
16/10/2023 15
Merci pour votre attention !
16/10/2023 16