Özet - Polimorfizm
- C++ kursu
- Orta seviye
- Ders 41/116
- 5 dk
virtual, abstract ve dynamic_cast'i birleştirerek bir işçi hiyerarşisi yazarsın.
Özet - Polimorfizm
Bu grupta polimorfizmi öğrendin. virtual metotlar dinamik dağıtım sağlar; taban işaretçi üzerinden türetilmiş uygulama çağrılır. Sanal tablo (vtable) bu mekanizmayı mümkün kılar.
Soyut sınıflar saf sanal fonksiyonlarla arayüz tanımlar. dynamic_cast güvenli tür indirmesi yapar. Sanal yıkıcı, polimorfik delete'te türetilmiş sınıfın da temizlenmesini sağlar. Bu araçlar birlikte esnek ve güvenli nesne yönelimli tasarım kurar.
Soyut sınıf ve sanal yıkıcı birlikte
İki aracı birlikte kullanalım: soyut sınıf ve sanal yıkıcı. Bir arayüz tanımlayıp türetilmiş sınıfı güvenle delete edebilirsin.
Örneğin Animal soyut sınıfı virtual void speak() = 0; ve virtual ~Animal() {} içerir. Cat sınıfı speak()'i uygular. Animal* a = new Cat(); ile oluştur, a->speak() ile çağır, delete a ile güvenle temizle. Bu, polimorfik tasarımın tam bir örneğidir.
Uygulama Animal soyut sınıfı ve Cat uygulaması
Animal soyut sınıfı tanımla; virtual void speak() = 0; ve virtual ~Animal() {}. Cat sınıfı miras alıp void speak() override gövdesi std::cout << "Miyav";. main içinde Animal* a = new Cat();, a->speak(); ve delete a; yaz.
Başlangıç kodu
#include <iostream>
// Animal ve Cat sınıflarını tanımla
int main() {
// Animal* ile Cat oluştur, speak çağır ve delete yap
return 0;
}Örnek çözüm
#include <iostream>
class Animal {
public:
virtual void speak() = 0;
virtual ~Animal() {}
};
class Cat : public Animal {
public:
void speak() override { std::cout << "Miyav"; }
};
int main() {
Animal* a = new Cat();
a->speak();
delete a;
return 0;
}Beklenen çıktı
Miyav
Uygulama dynamic_cast ve sanal yıkıcı birlikte
Base sınıfı tanımla; virtual void info() gövdesi std::cout << "Base"; ve virtual ~Base() {}. Derived sınıfı miras alıp void info() override gövdesi std::cout << "Derived";. main içinde Base* b = new Derived();, Derived* d = dynamic_cast<Derived*>(b);, if (d) d->info(); ve delete b; yaz.
Başlangıç kodu
#include <iostream>
// Base ve Derived sınıflarını tanımla
int main() {
// Base* ile Derived oluştur, dynamic_cast ile indir ve info çağır
return 0;
}Örnek çözüm
#include <iostream>
class Base {
public:
virtual void info() { std::cout << "Base"; }
virtual ~Base() {}
};
class Derived : public Base {
public:
void info() override { std::cout << "Derived"; }
};
int main() {
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b);
if (d) d->info();
delete b;
return 0;
}Beklenen çıktı
Derived
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Polimorfik sınıf hangisini içerir?
class A { ??? };- Yalnız static metot
- Yalnız const üye
- En az bir virtual metot Doğru cevap
- Yalnız inline değişken
Açıklama: Polimorfik sınıfta en az bir virtual metot bulunur.
2 Kavramı amacına eşle
| Kavram | Anlamı |
|---|---|
virtual |
Dinamik dağıtım |
= 0 |
Saf sanal |
dynamic_cast |
Güvenli indirgeme |
virtual ~Base |
Sanal yıkıcı |