• 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
En savoir plus ( Page)

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

L’identification des corps intermédiaires que le candidat, finalement défait, stigmatisait était claire : lors d’un discours précédemment tenu à l’occasion du

[r]

- 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

Elle se leva et Sakura la regarda pousser la porte contre laquelle elle avait fait glisser Kero.... Alison s’accroupit et avança dans

Ce mémoire ayant l’ambition d’éclairer l’évolution de la perception socio-gouvernementale des « drogues » au Etats-Unis à travers l’analyse des enjeux sociaux,

Une classe dérivée d’une classe non abstraite peut être déclarée abstraite et/ou contenir des méthodes abstraites... Java Classes et

6 Notre approche en sciences de la communication offre la possibilité d’articuler ces trois niveaux pour mieux comprendre les enjeux sous-jacents. Ainsi, par l’articulation et

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

• 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

410-2, alinéa 3, du code de commerce prévoit que le principe de liberté des prix ne fait pas obstacle « à ce que le Gouvernement arrête, par décret en Conseil d’État, contre

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

« 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,

• On peut ordonner les threads en utilisant des méthodes explicites pour endormir le thread courant, ou abandonner son exécution au profit d'un autre (sleep et

Je parle assez fort pour me faire entendre de tout l’auditoire.. Je présente et j’explique les documents présents

[r]

• Préparez un topo de +/-3 minutes pour présenter oralement votre affiche ; bien que certains aiment lire par eux-mêmes, d’autres préfèrent se la faire expliquer. •

caractéristique quelconque 1 par définition l’on dira qu’un ensemble algébrique (c’est-à-dire une réunion finie de variétés) est connexe s’il n’est pas

Considérons une liste dont on sépare la tête de liste h du reste de la liste t avec l’expression match liste with |h::t → A chaque appel récursif on fournira le reste de la liste t

Après avoir mené une enquête sur l’efficacité des dispositifs de vidéosurveillance dans trois villes françaises, Laurent Mucchielli dresse un constat sans appel :

De l’analyse anthropologique de Philippe Descola du «  naturalisme  » dominant dans le monde occidental à la dénonciation des discours scientifiques et politiques qui prônent les

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

Comme à la cime de cet univers étrange et familier, l’homme est pris de vertige : en quête de racines, il voudrait voir derrière chaque tronc un ami et retrouver avec lui

Mais si le terme de multimodalité renvoie à la notion d’actions multiples d’un médicament sur des cibles pharmacologiques, il recèle peut-être lui aussi une polysémie.. ➤