dynamic_cast conversion - 1

14:26

dynamic_cast tür dönüşümünde 'dynamic' sözcüğü, calışma zamanına karşılık gelmektedir. Program çalışma zamanında bir türden başka bir türe dönüşüm yapılmak istendiğinde kullanılan tür dönüştürme operatörüdür. Dinamik  tür dönüşümünde dönüştürülmek istenen türün polymorphic olması gerekmektedır. Bunun için de en azından bir virtual fonksiyonu olması gerekmektedir.


Yukarıdaki örnekte Base sınıfının hiç bir virtual fonksiyonu olmadığı için dynamic_cast işlemi aşağıdaki gibi bir hata ile karşılaşılacaktır.


cast işleminin çalışabilmesi için yukarıdaki örnek için Base sınıfına bir tane sanal fonksiyon eklenmiştir.


Aşağıdaki örnekte ise Foo ve Bar sınıfları Base sınıfından türemiş olsa da Foo ile Bar doğrudan birbirlerine dönüştürülemez. Dolayısıyla aşağıdaki örnekte dynamic_cast işlemi referansa cast edilmeye çalışılırsa başarısızlık durumunda nasıl bir senaryoyla karşılaşacağımız görülmektedir.


Başarısız bir cast işlemi std::bad_cast exception'ınına neden olacaktır.


Fakat adrese cast edilmek isteniyorsa bu durumda başarısızlık durumunda nullptr geri dönülecektir. Dolayısızla exception mekanizmasını programınıza dahil etmek istemiyorsanız pointer bazlı dönüşüm yapmak daha mantıklı olacaktır. 


Programın çıktısına bakarsanız cast işlemine gerek kalmadan her şey kontrol altına alınabilmektedir.


Son olarak dynamic_cast'in başka bir kullanım senaryosuda downcasting yapılarak üst türün alt türden olup olmadığının testini yapmaktır. Fakat bu amaç için virtual fonksiyon bulundurmak performans açısından istenmeyen bir durum olduğu için dynamic_cast yerine visitor pattern kullanılmaktadır. bu kullanım senaryosunu bir sonraki yazımızda anlatacağız.