dynamic_cast
- C++ kursu
- Orta seviye
- Ders 39/116
- 5 dk
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
#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
#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?
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
Dog* d = dynamic_cast<____>(a);
Dog* d = dynamic_cast<Dog*>(a);
Açıklama: Hedef tür türetilmiş sınıf işaretçisidir: Dog*.