Powiązanie statyczne (early binding, czas kompilacji):
void greet() { std::cout << "Hello!"; }
Powiązanie dynamiczne (late binding, czas wykonania):
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(); } // powiązanie dynamiczne
Kiedy używać:
Czy zastosowanie słowa kluczowego override przyśpieszy działanie funkcji wirtualnych?
Odpowiedź:
Nie, słowo kluczowe override służy tylko do wyraźnego wskazania kompilatorowi, że funkcja powinna nadpisywać wirtualną funkcję bazową. Nie wpływa to na wydajność ani sposób wywoływania funkcji.
class A { public: virtual void func(); }; class B : public A { public: void func() override; // dla sprawdzenia przez kompilator, ale nie zmienia szybkości wywołania };
Historia
W wysokoobciążonej bibliotece giełdowej zespół używał metod wirtualnych do większości operacji, nawet gdy polimorfizm nie był konieczny. W rezultacie system działał wolniej, niż planowano — głównym wąskim gardłem były wyszukiwania vtable.
Historia
W projekcie z rozszerzalnymi algorytmami pracownicy stosowali zwykłe metody zamiast wirtualnych. Później okazało się, że przy przekazywaniu obiektów przez wskaźniki bazowe zachowanie nie zmieniało się, pojawiały się błędne obliczenia; błędy usunięto dopiero po przepisaniu interfejsu.
Historia
W projekcie analizy plików multimedialnych programiści mylili metody statyczne i wirtualne. Niektóre funkcje dla różnych formatów zapomniano zadeklarować jako wirtualne i nie nadpisano w dziedziczących klasach, co skutkowało niewłaściwą ścieżką przetwarzania plików, a wyniki były buforowane z błędami.