Statische binding (early binding, compileertijd):
void greet() { std::cout << "Hello!"; }
Dynamische binding (late binding, runtime):
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(); } // dynamische binding
Wanneer te gebruiken:
Zal het gebruik van het sleutelwoord override de prestaties van virtuele functies versnellen?
Antwoord:
Nee, het sleutelwoord override dient alleen om de compiler expliciet te laten weten dat de functie een virtuele basisfunctie moet overschrijven. Het heeft geen invloed op de prestaties of de manier waarop functies worden aangeroepen.
class A { public: virtual void func(); }; class B : public A { public: void func() override; // voor controle door de compiler, maar verandert niet de snelheid van aanroep };
Verhaal
In een hoogbelaste beursbibliotheek gebruikte het team virtuele methoden voor de meeste operaties, zelfs wanneer polymorfisme niet nodig was. Als gevolg hiervan werkte het systeem trager dan gepland — de belangrijkste bottleneck was in de vtable opzoeken.
Verhaal
In een project met uitbreidbare algoritmen gebruikten medewerkers gewone methoden in plaats van virtuele. Later bleek dat het gedrag niet veranderde wanneer objecten via basiswijzers werden doorgegeven; er vonden verkeerde berekeningen plaats; bugs werden pas verholpen door de interface opnieuw te schrijven.
Verhaal
In een project voor media-analyse verwisselden ontwikkelaars statische en virtuele methoden. Sommige functies voor verschillende indelingen waren vergeten om virtueel te declareren en werden niet overschreven in afgeleiden, waardoor de verwerking van bestanden op de verkeerde manier verliep en de resultaten met fouten in de cache werden opgeslagen.