Vous êtes sur la page 1sur 16

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;

objetA.afficher();
}

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

Vous aimerez peut-être aussi