Binding statico (early binding, tempo di compilazione):
void greet() { std::cout << "Hello!"; }
Binding dinamico (late binding, tempo di esecuzione):
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(); } // binding dinamico
Quando usare:
L'uso della parola chiave override velocizzerà le funzioni virtuali?
Risposta:
No, la parola chiave override serve solo per indicare esplicitamente al compilatore che la funzione deve sovrascrivere una funzione virtuale base. Non influisce sulle prestazioni o sul modo in cui vengono chiamate le funzioni.
class A { public: virtual void func(); }; class B : public A { public: void func() override; // per verifica del compilatore, ma non cambia la velocità di chiamata };
Storia
In una libreria di scambio altamente carica, il team utilizzava metodi virtuali per la maggior parte delle operazioni, anche quando il polimorfismo non era necessario. Di conseguenza, il sistema funzionava più lentamente del previsto — il principale collo di bottiglia si trovava nelle ricerche della vtable.
Storia
In un progetto con algoritmi estensibili, i dipendenti applicavano metodi normali invece di metodi virtuali. Si scoprì successivamente che, quando si passavano oggetti attraverso puntatori base, il comportamento non cambiava e si verificavano calcoli errati; i bug furono risolti solo riscrivendo l'interfaccia.
Storia
In un progetto di analisi di file multimediali, gli sviluppatori confondevano metodi statici e virtuali. Alcune funzioni per diversi formati dimenticavano di dichiarare come virtuali e non venivano sovrascritte nei figli, il che portava a un'elaborazione dei file errata e i risultati venivano memorizzati con errori.