C++
Özet - Polimorfizm
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.
Örnek çözümü göster
#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;
}
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Polimorfik sınıf hangisini içerir?
class A { ??? };
- Yalnız static metot
- Yalnız const üye
- En az bir virtual metot
- Yalnız inline değişken
Cevabı göster
En az bir virtual metot — Polimorfik sınıfta en az bir virtual metot bulunur.
-
Kavramı amacına eşle
- virtual
- Dinamik dağıtım
- = 0
- Saf sanal
- dynamic_cast
- Güvenli indirgeme
- virtual ~Base
- Sanal yıkıcı
Sıradaki ders: Quiz modeli