CodeBlanks Logo Icon CodeBlanks

Ö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.

Başlangıç kodu

main.cpp
#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

main.cpp
#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

main.cpp
#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

main.cpp
#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?

main.cpp
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ı

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