Sanal fonksiyonlar C++'da dinamik polimorfizm aracı olarak baştan beri mevcuttur. Ancak, daha önce, türetilmiş sınıflardaki sanal fonksiyonların yeniden tanımlanmasının doğruluğunu kontrol etmek için derleyiciyi zorlayan bir sözdizimsel mekanizma yoktu. C++11'den sonra override anahtar kelimesi, ek bir derleyici kontrol aracı haline geldi.
override olmadan, derleyici fonksiyonun gerçekten temel sınıfın metodunu yeniden tanımlayıp tanımlamadığını garanti etmez. İmza hataları (örneğin, yanlış tür veya const) türetilmiş sınıfta yeni bir fonksiyonun oluşturulmasına ("gölgeleme") yol açar, bu da polimorfizmi kırar ve hata ayıklamayı zorlaştırır.
Türetilmiş sınıfta sanal bir fonksiyon bildirirken override kullanımının, derleyicinin temel sınıfın sanal fonksiyonu ile tam eşleştiğini kontrol etmesini sağlaması ve fonksiyonun gerçekten ebeveyni yeniden tanımladığından emin olmasıdır. Aksi takdirde, derleme bir hata ile durdurulur.
Kod örneği:
struct Base { virtual void foo() const {} }; struct Derived : Base { void foo() const override { /* uygulama */ } };
Eğer Derived içinde void foo() yazarsanız const override olmadan, derleyici hata verecektir.
Anahtar özellikler:
'override' anahtar kelimesiyle, ama 'virtual' anahtar kelimesi olmadan sanal bir fonksiyonu bırakmak mümkün mü?
Evet, override, fonksiyonun sanal olduğunu varsayar. override ile birlikte virtual belirtmek gereksizdir, ancak yasak değildir.
Fonksiyon sadece const veya ref qualifier (örneğin, & veya &&) ile farklıysa hata olabilir mi?
Evet, imzadaki her türlü farklılık, const/referanslar dahil, yeniden tanımlamayı kırar. Örneğin, void foo() override, void foo() const'ı yeniden tanımlamaz ve derleyici override sayesinde bunu tespit eder.
'override' anahtar kelimesini statik fonksiyonlara veya yapıcılara uygulamak mümkün mü?
Hayır. override yalnızca sanal fonksiyonlar için geçerlidir, statik fonksiyonlara, yapıcılara, yok edicilere (eğer sanal değillerse) uygulanamaz.
Büyük bir projede, bir miras sınıfının fonksiyon imzasında yazım hatası vardır: fonksiyon aslında override değildir, ancak geliştirici aksi düşünmektedir, polimorfizm beklendiği gibi çalışmaz.
Artılar:
Eksiler:
Tüm türetilmiş sınıflarda override kullanımı, hataları derleme aşamasında yakalar.
Artılar:
Eksiler: