Polimorfizm temelleri
- C++ kursu
- Orta seviye
- Ders 36/116
- 5 dk
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
#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
#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?
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
class Animal { public: ____ void speak() { } };
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ı |