Statik bağlama (erken bağlama, derleme zamanı):
void greet() { std::cout << "Hello!"; }
Dinamik bağlama (geç bağlama, çalışma zamanı):
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(); } // dinamik bağlama
Ne zaman kullanılmalı:
override anahtar kelimesinin kullanımı sanal fonksiyonların performansını artırır mı?
Cevap:
Hayır, override anahtar kelimesi derleyiciye bir fonksiyonun sanal temel fonksiyonu geçersiz kılacağını açıkça belirtmek için kullanılır. Performansa veya fonksiyonların çağrılma şekline etki etmez.
class A { public: virtual void func(); }; class B : public A { public: void func() override; // derleyici tarafından kontrol için, ancak çağrı hızını değiştirmez };
Hikaye
Yüksek trafikli bir borsa kütüphanesinde ekip, ihtiyaç duyulmadığı halde çoğu işlem için sanal metotlar kullandı. Sonuçta sistem, planlandığı gibi çalışmadı — ana darboğaz vtable aramalarıydı.
Hikaye
Genişletilebilir algoritmalar projesinde çalışanlar sanal metotlar yerine normal metotlar kullandılar. Daha sonra, nesneler temel işaretçiler aracılığıyla iletildiğinde davranışın değişmediği ve yanlış hesaplamaların yapıldığı ortaya çıktı; hatalar, sadece arayüz yeniden yazılarak giderildi.
Hikaye
Medya dosyası analizi projesinde geliştiriciler, statik ve sanal metotları karıştırdılar. Farklı formatlar için bazı fonksiyonları sanal olarak belirtmeyi unuttular ve miras alanlarda geçersiz kılmadılar; bu nedenle dosya işleme yanlış yolda ilerledi ve sonuçlar hatalarla önbelleğe alındı.