Fonctions virtuelles et vtable
Implémenter le polymorphisme à l’exécution avec des fonctions virtuelles et examiner le concept de vtable
Fonctions virtuelles et vtable est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Liaison statique ou dynamique
Par défaut, les appels de membres sont liés statiquement : le compilateur choisit la fonction en fonction du type déclaré. Avec les fonctions virtual, l'appel est lié dynamiquement en fonction du type réel.
Déclarer une fonction virtuelle
Marquez la fonction avec virtual dans la classe de base. Les classes dérivées peuvent la redéfinir.
class Shape {
public:
virtual double area() const = 0; // pure virtual
virtual ~Shape() = default;
};
class Circle : public Shape {
double r_;
public:
Circle(double r) : r_(r) {}
double area() const override { return 3.14159 * r_ * r_; }
};Le spécificateur override
Ajoutez override aux méthodes dérivées. Le compilateur vérifie que la fonction redéfinit bien une fonction virtuelle, ce qui permet de détecter les fautes de frappe dans la signature.
Le spécificateur final
final empêche toute redéfinition ultérieure. Utilisez-le sur les classes dont l'héritage doit être interdit, ou sur les méthodes qui ne doivent plus être redéfinies.
class Concrete final : public Base { /* ... */ };
class Base {
virtual void f() final; // cannot be overridden
};Appeler via un pointeur vers la classe de base
La magie du polymorphisme : un pointeur vers la classe de base peut appeler la méthode correcte de la classe dérivée.
Shape* s = new Circle(3.0);
std::cout << s->area(); // 28.27... (Circle::area)
delete s;Le concept de table virtuelle
Chaque classe polymorphe possède une table virtuelle cachée : une table de pointeurs de fonctions. Chaque objet contient un pointeur caché (vptr) vers la table virtuelle de sa classe.
Coût des appels virtuels
Un appel virtuel ajoute une indirection via la table virtuelle. Ce coût est négligeable dans la plupart des codes. Évitez les appels virtuels dans les boucles internes s'il a été mesuré qu'ils constituent un goulot d'étranglement.
Fonctions virtuelles pures
Ajoutez = 0 pour rendre une fonction purement virtuelle. Les classes dérivées doivent la redéfinir pour pouvoir être instanciées. La classe devient abstraite.
Destructeurs virtuels
Si une classe possède une fonction virtuelle ou est destinée à être supprimée via un pointeur vers la classe de base, donnez-lui un destructeur virtuel. Sinon, le destructeur de la classe dérivée ne s'exécute jamais.
class Base {
public:
virtual ~Base() = default; // safe to delete through Base*
};Polymorphisme avec des pointeurs intelligents
Conservez les objets polymorphes via des pointeurs intelligents vers la classe de base. Le pointeur intelligent gère correctement la destruction.
std::unique_ptr<Shape> s = std::make_unique<Circle>(3.0);Retour sur le tronquage
Transmettre un objet de la classe dérivée par valeur à une fonction qui attend la classe de base supprime la partie dérivée. Utilisez des références ou des pointeurs pour les paramètres polymorphes.
Compromis en matière de performances
Les fonctions virtuelles ajoutent de la souplesse à un faible coût d'exécution. Les modèles offrent un polymorphisme à la compilation sans coût d'exécution : choisissez selon que le polymorphisme est nécessaire à l'exécution ou non.
Vérification rapide
Pourquoi une classe de base polymorphe devrait-elle avoir un destructeur virtual ?
Récapitulatif
Les fonctions virtuelles permettent le polymorphisme à l'exécution grâce à une table virtuelle par classe. Marquez les redéfinitions avec override et empêchez tout nouvel héritage avec final. Donnez toujours un destructeur virtuel aux classes de base polymorphes.
Questions Fréquemment Posées
La leçon « Fonctions virtuelles et vtable » est-elle gratuite ?
Oui — le texte complet de « Fonctions virtuelles et vtable » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Fonctions virtuelles et vtable » ?
Implémenter le polymorphisme à l’exécution avec des fonctions virtuelles et examiner le concept de vtable Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Fonctions virtuelles et vtable » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Héritage simple et multiple
- Fonctions virtuelles et vtable
- Classes abstraites et méthodes virtuelles pures
- Héritage ou composition : compromis