Polymorphism (Çok Biçimlilik): virtual Fonksiyonlar ve override

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16

Polymorphism: Tek Arayüz, Çok Farklı Davranış​


Çok biçimlilik, bir nesnenin kendi türü gibi değil de, miras aldığı üst tür gibi davranabilmesi ama yine de kendi özel yeteneklerini sergileyebilmesi sanatıdır. "Her hayvan ses çıkarır, ama kedi miyavlar, köpek havlar."



1. virtual Fonksiyonlar: Kararı Çalışma Zamanına Bırakmak​


Normalde C++, hangi fonksiyonun çağrılacağına derleme aşamasında karar verir (Static Binding). Ancak bir fonksiyonun başına virtual anahtar kelimesini eklerseniz, derleyiciye şunu demiş olursunuz: "Bu fonksiyonun hangi versiyonunun çalışacağına, program çalışırken (Runtime) nesnenin gerçek türüne bakarak karar ver."

C++:
class Hayvan {
public:
virtual void sesCikar() { // Virtual ile 'modifiye edilebilir' hale getirdik
cout << "Hayvan genel bir ses cikardi." << endl;
}
};

class Kedi : public Hayvan {
public:
void sesCikar() override { // Üst sınıftaki fonksiyonu eziyoruz
cout << "Miyav!" << endl;
}
};



2. override Anahtar Kelimesi Neden Önemli?​


override, C++11 ile gelen bir güvenlik önlemidir. Bir fonksiyonu ezerken hata yapmanızı (örneğin parametreleri yanlış yazmanızı) engeller. Eğer üst sınıfta o isimde bir virtual fonksiyon yoksa, derleyici size hemen hata verir.

İpucu: Bir fonksiyonu alt sınıfta değiştirmek istiyorsanız, okunabilirlik ve hata takibi adına her zaman override kelimesini kullanın.



3. Neden Çok Biçimlilik Kullanırız? (V-Table Mantığı)​


Çok biçimlilik sayesinde, farklı türden nesneleri tek bir listede toplayabilir ve hepsine aynı komutu verebiliriz. Arka planda C++, her nesne için bir Virtual Method Table (V-Table) oluşturur ve doğru fonksiyon adresini oradan bulur.

C++:
void SesleriDinle(Hayvan* hPtr) {
hPtr->sesCikar(); // hPtr ister kedi olsun ister köpek, dogru ses cikacaktir!
}

int main() {
Hayvan* hayvanlar[2];
hayvanlar[0] = new Kedi();
hayvanlar[1] = new Kopek();

for(int i = 0; i < 2; i++) {
    hayvanlar[i]->sesCikar(); // Çok biçimliliğin gücü burada!
}

}



4. Saf Sanal Fonksiyonlar (Pure Virtual) ve Soyut Sınıflar​


Bazen üst sınıfın o fonksiyon için bir tanımı olmasını istemeyiz (Örn: "Şekil" diye bir nesne olabilir ama "Şekil çiz" dediğimizde ne çizeceğini bilemez). Bu durumda fonksiyonu 0'a eşitleyerek Pure Virtual yaparız.

C++:
class Sekil {
public:
virtual void alanHesapla() = 0; // Saf sanal fonksiyon
};
Not: İçinde en az bir tane saf sanal fonksiyon bulunan sınıflara "Soyut Sınıf" (Abstract Class) denir ve bu sınıflardan doğrudan nesne üretilemez.



Sonuç​


Polymorphism, büyük yazılım projelerinde "genişletilebilir" kod yazmanın anahtarıdır. Yeni bir hayvan türü eklediğinizde mevcut döngülerinizi veya ana kodunuzu değiştirmenize gerek kalmaz; sadece yeni sınıfı türetip virtual fonksiyonu ezmeniz yeterlidir.
 
Geri
Üst