C++'da güvenli tip dönüşümü (type casting), static_cast, dynamic_cast, const_cast, reinterpret_cast operatörleri ile sağlanır.
nullptr, referanslar için ise istisna döndürür.Ne zaman kullanılmalı:
dynamic_cast kullanın. Basit/uyumlu türler arasında dönüşüm yapmak için static_cast kullanın.Örnek:
struct Base { virtual ~Base() {} }; struct Derived : Base { void foo() {} }; void test_cast(Base* base) { // Alt sınıfa güvenli dönüşüm Derived* d = dynamic_cast<Derived*>(base); if (d) { d->foo(); } }
Soru: Eğer bir nesne gerçekten türetilmiş bir sınıfın örneği değilse, onu static_cast ile temel sınıfın nesnesine dönüştürebilir miyiz?
Cevap: Evet, static_cast derlenir fakat nesne gerçekten türetilmiş sınıfın nesnesi değilse davranış belirsiz olacaktır. Sadece dynamic_cast bu tür dönüşümlerin güvenliğini garanti eder. Type downcasting için static_cast kullanımı sadece nesnenin gerçek tipi hakkında kesin bilgi varsa kabul edilebilir.
Hikaye
Büyük bir embedded sistemde, üst sınıf ve alt sınıf arasındaki dönüşümler static_cast ile yapılıyordu. Bazı durumlarda, mevcut olmayan alanlara erişim girişiminde çökmesine neden oluyordu — program farklı bir türdeki belleği yorumlamaya çalışıyordu.
Hikaye
Eklenti mimarisi geliştirilirken, programcılar farklı türler arasında işaretçi dönüşümleri için reinterpret_cast kullanarak, çalışma zamanı hatalarına ve bellek okumalarına neden oluyorlardı.
Hikaye
Genel bir kurumsal çatıda, temel sınıfta sanal yıkıcıları unutmak, dynamic_cast'in düzgün çalışmasını engelliyor ve temel sınıf işaretçisi üzerinden bir nesne silinmeye çalışıldığında bellek sızmalarına ve bozulmalara yol açıyordu.