CodeBlanks Logo Icon CodeBlanks

Polimorfizm temelleri

Aynı çağrının farklı türlerde farklı davranmasını öğrenirsin.

Polimorfizm temelleri

Polimorfizm, bir taban sınıf işaretçisi üzerinden türetilmiş sınıfın metodunun çağrılabilmesidir. Bunun için taban sınıfta metot virtual yapılır.

Örnek: class Animal { public: virtual void speak() { } };. Dog sınıfı Animal'dan miras alıp speak()'i geçersiz kılar. Animal* a = new Dog(); ile işaretçi oluşturup a->speak(); çağrısı Dog::speak()'i çalıştırır. Bu, virtual sayesinde dinamik dağıtım ile gerçekleşir. override anahtar kelimesi geçersiz kılma niyetini belirtir.

Dinamik dağıtım

virtual bir metot çağrıldığında, derleyici işaretçinin gerçek türüne bakarak hangi uygulamanın çalışacağını belirler. Bu, dinamik dağıtım (dynamic dispatch) olarak bilinir.

Eğer speak() virtual olmasaydı, Animal* a = new Dog(); üzerinden a->speak() yalnız Animal::speak()'i çalıştırırdı. virtual sayesinde en türetilmiş uygulama seçilir. override yazmak zorunlu değildir ama hataları yakalar: yanlış imza yazılırsa derleme hatası verir.

Uygulama Animal ve Dog sınıflarını tanımla

Animal sınıfı tanımla; public: altına virtual void speak() ekle, gövdesi std::cout << "Ses";. Dog sınıfı Animal'dan miras alsın; void speak() override gövdesi std::cout << "Hav";. main içinde Animal* a = new Dog(); yaz, a->speak(); çağır ve delete a; yap.

Başlangıç kodu

main.cpp
#include <iostream>

// Animal ve Dog sınıflarını tanımla

int main() {
    // Animal* ile Dog oluştur ve speak çağır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

class Animal {
public:
    virtual void speak() { std::cout << "Ses"; }
};

class Dog : public Animal {
public:
    void speak() override { std::cout << "Hav"; }
};

int main() {
    Animal* a = new Dog();
    a->speak();
    delete a;
    return 0;
}

Beklenen çıktı

Hav

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 virtual anahtar kelimesi ne işe yarar?

main.cpp
virtual void speak() { }
  • Metodu gizler
  • Dinamik dağıtım sağlar Doğru cevap
  • Metodu private yapar
  • Metodu hızlandırır

Açıklama: virtual, taban işaretçiden türetilmiş uygulamanın çağrılmasını sağlar.

2 Sanal metot bildirimini tamamla

Soru
class Animal { public: ____ void speak() { } };
Cevap
class Animal { public: virtual void speak() { } };

Açıklama: virtual, dinamik dağıtımı etkinleştirir.

3 Bileşeni rolüne eşle

Kavram Anlamı
virtual Dinamik dağıtım
override Geçersiz kılma
Animal* Taban işaretçi
->speak() İşaretçiyle çağrı

Orta seviye bölümündeki tüm dersler