CodeBlanks Logo Icon CodeBlanks

dynamic_cast

dynamic_cast ile güvenli downcast öğrenirsin.

dynamic_cast

dynamic_cast, polimorfik sınıflarda güvenli tür indirgeme (downcast) yapmak için kullanılır. Taban işaretçiyi türetilmiş türe çevirir; dönüşüm geçersizse nullptr döndürür.

Örnek: Animal* a = new Dog();. Eğer a'nın gerçekten bir Dog olduğunu biliyorsan Dog* d = dynamic_cast<Dog*>(a); yazarsın. d nullptr değilse d->fetch() çağrılır. dynamic_cast çalışması için sınıfın en az bir virtual metodu olmalıdır; aksi halde derleme hatası verir.

RTTI ve nullptr denetimi

dynamic_cast, çalışma zamanı tür bilgisi (RTTI) kullanır. İşaretçinin gerçek türünü vtable üzerinden denetler; bu yüzden yalnız polimorfik sınıflarda çalışır.

Eğer tür uyumsuzsa referans için std::bad_cast istisnası fırlatır; işaretçi için nullptr döndürür. İşaretçi kullanıp if (d) denetimi yapmak daha güvenlidir. dynamic_cast küçük bir performans maliyeti taşır; ama yanlış tür indirgeme kaynaklı çökmeleri önler.

Uygulama dynamic_cast ile Dog'a indir

Animal sınıfı tanımla; virtual void speak() ve virtual ~Animal() {}. Dog sınıfı miras alıp speak() override eklesin ve ek olarak void fetch() metodu gövdesi std::cout << "Top";. main içinde Animal* a = new Dog();, Dog* d = dynamic_cast<Dog*>(a);, if (d) d->fetch(); ve delete a; yaz.

Başlangıç kodu

main.cpp
#include <iostream>

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

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

Örnek çözüm

main.cpp
#include <iostream>

class Animal {
public:
    virtual void speak() {}
    virtual ~Animal() {}
};

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

int main() {
    Animal* a = new Dog();
    Dog* d = dynamic_cast<Dog*>(a);
    if (d) d->fetch();
    delete a;
    return 0;
}

Beklenen çıktı

Top

Soru ve cevaplar

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

1 dynamic_cast ne zaman kullanılır?

main.cpp
Dog* d = dynamic_cast<Dog*>(a);
  • Güvenli tür indirgeme için Doğru cevap
  • Static değişken için
  • Dizi erişimi için
  • Tür yükseltme için

Açıklama: dynamic_cast taban işaretçiyi türetilmiş türe güvenle çevirir.

2 Bileşeni rolüne eşle

Kavram Anlamı
dynamic_cast Güvenli tür indirgeme
Dog* Hedef tür
virtual ~Animal Gerekli polimorfik taban
if (d) Boş işaretçi denetimi

3 dynamic_cast çağrısını tamamla

Soru
Dog* d = dynamic_cast<____>(a);
Cevap
Dog* d = dynamic_cast<Dog*>(a);

Açıklama: Hedef tür türetilmiş sınıf işaretçisidir: Dog*.

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