Liaison statique (early binding, temps de compilation) :
void greet() { std::cout << "Hello!"; }
Liaison dynamique (late binding, temps d'exécution) :
class Animal { public: virtual void speak() { std::cout << "Animal"; } }; class Dog : public Animal { public: void speak() override { std::cout << "Woof"; } }; void foo(Animal* a) { a->speak(); } // liaison dynamique
Quand utiliser :
L'utilisation du mot-clé override accélérera-t-elle l'exécution des fonctions virtuelles ?
Réponse :
Non, le mot-clé override sert uniquement à indiquer explicitement au compilateur que la fonction doit remplacer la fonction virtuelle de base. Cela n'affecte pas la performance ou la façon dont les fonctions sont appelées.
class A { public: virtual void func(); }; class B : public A { public: void func() override; // pour vérification par le compilateur, mais n'affecte pas la vitesse d'appel };
Histoire
Dans une bibliothèque boursière à fort trafic, l'équipe a utilisé des méthodes virtuelles pour la plupart des opérations, même lorsque le polymorphisme n'était pas nécessaire. En conséquence, le système fonctionnait plus lentement que prévu — le principal goulot d'étranglement se trouvait dans les recherches dans la vtable.
Histoire
Dans un projet avec des algorithmes extensibles, les employés ont utilisé des méthodes normales au lieu de virtuelles. Plus tard, il est apparu que lors du passage d'objets via des pointeurs de base, le comportement ne changeait pas et des calculs incorrects se produisaient ; les bugs n'ont été corrigés qu'en réécrivant l'interface.
Histoire
Dans un projet d'analyse de fichiers multimédias, les développeurs confondaient méthodes statiques et virtuelles. Certaines fonctions pour différents formats ont été oubliées d'être déclarées comme virtuelles et n'ont pas été redéfinies dans les classes dérivées, ce qui a conduit à un traitement incorrect des fichiers et à des résultats mis en cache avec des erreurs.