IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Les fonctions virtuelles en C++ : Types statiques et types dynamiques


précédentsommaire

XXIV. À retenir

Par défaut, en C++, les fonctions membres ne sont pas virtuelles. Le mot-clé virtual est nécessaire pour définir une fonction virtuelle.

L'appel d'une fonction virtuelle sur un pointeur ou une référence utilise le type dynamique et est résolu à l'exécution.

Le type statique d'un pointeur ou d'une référence est celui défini dans le code. Le type dynamique est celui de l'objet effectivement pointé/référencé.

Un destructeur d'une classe utilisée pour l'héritage public doit être virtuel s'il est public ou protégé s'il est non virtuel.

Un destructeur public et non virtuel indique que la classe ne doit pas être utilisée pour un héritage public.

Une fonction virtuelle ne peut être inlinée dans un appel polymorphe.

Appeler une fonction virtuelle dans un constructeur ou un destructeur n'appelle pas la fonction la plus spécialisée de l'objet en cours de construction, mais celle disponible pour le constructeur en cours d'exécution.

L'appel d'une fonction virtuelle pure dans le constructeur ou le destructeur d'une classe abstraite produit un comportement indéterminé.

Evitez d'introduire des masquages de fonctions.

Une fonction générique (template) ne peut pas être virtuelle.

Une classe générique peut avoir des fonctions membres virtuelles.

L'amitié ne s'hérite pas : déclarer amie une fonction virtuelle est faiblement utile.

Une fonction virtuelle ne peut s'engager à lever plus d'exceptions que celles précisées dans la définition la plus spécialisée de ses classes de base.

Les préconditions d'une fonction virtuelle dans la classe dérivée ne peuvent être plus restrictives que celle de la définition la plus spécialisée de ses classes de base. En revanche, elles peuvent être plus lâches autorisant l'utilisation de la spécialisation avec le type dérivé là où la classe de base ne sait pas faire.

Les postconditions d'une fonction virtuelle dans la classe dérivée ne peuvent être plus lâches que celle de la définition la plus spécialisée de ses classes de base. En revanche, elles peuvent être plus restrictives.

En sortie d'une fonction virtuelle, les invariants de la classe dérivée et de la classe de base doivent être respectés.

Un transtypage d'un pointeur ou d'une référence depuis la classe de base vers la classe dérivée est souvent signe d'un problème de conception.

XXV. Un peu de lecture

Normes et livres :

Articles :

XXVI. Remerciements

Je remercie Alp, r0d et Goten pour leurs relectures et leurs conseils avisés et ainsi que Luc Hermitte dont la compétence, l'étendue des connaissances et l'attention aux petits détails n'ont d'égales que la patience, la persévérance et la générosité à les partager. Sans eux imprécisions, approximations, oublis et erreurs seraient bien trop nombreux dans cet article.
Encore merci à dourouc05 et à koala01 pour la grand-mère et l'aurteaugraffe.
Enfin, d'une façon plus globale, je remercie les membres des forums de développez.com qui, par la qualité de leurs interventions, m'ouvrent constamment de nouvelles pistes de réflexion sur ma pratique de développement.


précédentsommaire

Copyright © 2009 3DArchi. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.