• Aucun résultat trouvé

Chapitre 16 Fonctions virtuelles et classes abstraites

N/A
N/A
Protected

Academic year: 2022

Partager "Chapitre 16 Fonctions virtuelles et classes abstraites"

Copied!
4
0
0

Texte intégral

(1)

Chapitre 16 : Fonctions virtuelles et classes abstraites 261

© Mohamed N. Lokbani v1.01 POO avec C++

Chapitre 16

Fonctions virtuelles et classes abstraites

Chapitre 16 : Fonctions virtuelles et classes abstraites 262

© Mohamed N. Lokbani v1.01 POO avec C++

1. Généralités

- Ligature statique => choix de la fonction membre dépend du type statique par exemple : de l'objet receveur.

- Le typage statique est le type par défaut en C++.

- Ligature dynamique => choix de la fonction dépend du type dynamique.

- Le mot clé virtual force la ligature dynamique.

2. Fonction virtuelle (

virtual

)

#include <iostream>

using namespace std;

class X { public:

void f() { cout << "x:f\n";}

};

class Y:public X { public:

void f() {cout << "y:f\n";}

};

(2)

Chapitre 16 : Fonctions virtuelles et classes abstraites 263

© Mohamed N. Lokbani v1.01 POO avec C++

int main() { X a;

Y b;

X* ptr = &a;

ptr->f();

ptr = &b;

ptr->f();

return 0;

}

Sortie:

x:f x:f

- Suite à 2 appels ptr->f(), nous constatons que les deux utilisent la même version de la fonction f définie dans la classe de base X car ptr est un pointeur du type X et ne voit donc pas que les propriétés de la classe X.

- Comment faire pour que ptr fasse correctement l'appel à la fonction membre f? - Il faut déclarer la fonction f comme étant virtuelle.

Chapitre 16 : Fonctions virtuelles et classes abstraites 264

© Mohamed N. Lokbani v1.01 POO avec C++

class X { public:

virtual void f() { cout << "x:f\n";}

};

- Par cette écriture, le 2e appel ptr->f() fera référence à la fonction f de la classe Y au lieu de la fonction f de la classe de X.

3. Polymorphisme

- Le même appel ptr->f() correspond à deux résultats différents (fonctions différentes: f de X, et f de Y).

- La fonction est sélectionnée en fonction de la classe pointée par le pointeur ptr.

4. Ligature dynamique

- L'association de l'appel à la partie du code à exécuter est différée (attend l'exécution pour définir le type) au moment de l'exécution du programme, opération plus coûteuse.

- virtual permet de masquer le typage statique.

(3)

Chapitre 16 : Fonctions virtuelles et classes abstraites 265

© Mohamed N. Lokbani v1.01 POO avec C++

5. Qui peut être "

virtual"

et qui ne le peut pas?

- Peuvent être "virtual":

• Fonctions membres non statiques.

• Destructeurs.

- Ne peuvent pas être "virtual":

• Champs membres.

• Constructeurs.

6. Classes abstraites

- Une classe abstraite n'existe que pour être héritée.

- Une classe est dite abstraite si elle contient au moins une fonction virtuelle pure.

Chapitre 16 : Fonctions virtuelles et classes abstraites 266

© Mohamed N. Lokbani v1.01 POO avec C++

class X {

// Affiche est une fonction virtuelle pure car = 0. virtual void affiche() = 0;

};

- Il est impossible de créer (instancier) un objet à partir d'une classe abstraite.

int main () { X a; // Erreur return 0;

}

(4)

Chapitre 16 : Fonctions virtuelles et classes abstraites 267

© Mohamed N. Lokbani v1.01 POO avec C++

- Les classes qui héritent d'une classe abstraite doivent obligatoirement définir la ou les fonctions virtuelles pures.

class Y:public X {

// Même si le mot-clé virtual ne précède pas le nom // de la fonction affiche, elle reste quand même virtuelle // car dans la classe de base, elle est déclarée ainsi.

// Donc nous n'avons pas besoin de le préciser encore // une fois.

void affiche() { cout << "Y:f\n";

} };

Chapitre 16 : Fonctions virtuelles et classes abstraites 268

© Mohamed N. Lokbani v1.01 POO avec C++

Références

Documents relatifs

Soit les 2 pages php suivantes : index.php et blog.php. La balise nav contient un ul et 2 li avec des href permettant de passer d’une page à l’autre. Pour l’exercice, réécrire

« D’abord, le fait considérable de l’universalité du langage : « Tous les hommes parlent » ; c’est là un critère d’humanité à côté de l’outil,

- d'utiliser en quelque sorte l'héritage multiple, même si cette notion est inexistante en java: Une classe dérivée ne peut hériter que d'une seule classe de

[r]

[r]

Nous souhaitons pouvoir transformer les figures: translater, mettre à l’échelle, calculer des distances et des surfaces (figures fermées), et bien sûr afficher les figures... Etude

• La courbe représentative de la fonction carrée est symétrique par rapport à l’axe des ordonnées.... Or un carré est toujours positif

Universit´ e Claude Bernard - Lyon 1 Semestre de printemps 2019-2020 UE de calcul diff´ erentiel et analyse complexe.. Feuille d’exercices n o 7: Fonctions holomorphes, conditions