Statisches Binding (early binding, Kompilierungszeit):
void greet() { std::cout << "Hallo!"; }
Dynamisches Binding (late binding, Laufzeit):
class Animal { public: virtual void speak() { std::cout << "Tier"; } }; class Dog : public Animal { public: void speak() override { std::cout << "Wuff"; } }; void foo(Animal* a) { a->speak(); } // dynamisches Binding
Wann verwenden:
Wird die Verwendung des Schlüsselworts override die Leistung von virtuellen Funktionen beschleunigen?
Antwort:
Nein, das Schlüsselwort override dient nur dazu, dem Compiler explizit anzuzeigen, dass die Funktion die virtuelle Basisklassefunktion überschreiben soll. Es hat keinen Einfluss auf die Leistung oder die Art des Funktionsaufrufs.
class A { public: virtual void func(); }; class B : public A { public: void func() override; // für die Überprüfung durch den Compiler, ändert jedoch nicht die Aufrufgeschwindigkeit };
Geschichte
In einer hochbelasteten Börsenbibliothek verwendete das Team virtuelle Methoden für die meisten Operationen, auch wenn Polymorphie nicht erforderlich war. Infolgedessen arbeitete das System langsamer als geplant — der Hauptengpass lag bei den vtable-Lookups.
Geschichte
In einem Projekt mit erweiterbaren Algorithmen verwendeten die Mitarbeiter gewöhnliche Methoden anstelle von virtuellen. Später stellte sich heraus, dass sich das Verhalten bei der Übergabe von Objekten über Basispointer nicht änderte, was zu falschen Berechnungen führte; Bugs wurden nur durch Neuschreiben der Schnittstelle behoben.
Geschichte
In einem Projekt zur Analyse von Mediendateien verwechselten die Entwickler statische und virtuelle Methoden. Einige Funktionen für verschiedene Formate wurden vergessen, als virtuell deklariert zu werden, und wurden nicht in den Nachfolgern überschrieben, wodurch die Verarbeitung der Dateien den falschen Weg nahm und die Ergebnisse fehlerhaft zwischengespeichert wurden.