Aşağıdaki kodları öncelikle inceleyebilir, konu başlığı ile ilgili bir fikir edinme çabasında bulunabilirsiniz.
Ben de kodların aşağında, bu kodları adım adım açıklayacağım.
#include<iostream>
#include<typeinfo>
using namespace std;
/* Temel Sınıfımız */
class tsinif
{
protected:
int tdegisken;
public:
tsinif() : tdegisken(0) {}
tsinif(int t) : tdegisken(t) {}
virtual void sanal()
{}
void yazdir()
{cout<<"tdegisken : "<< tdegisken <<endl;}
};
/* Türetilmiş Sınıfımız */
class altsinif : public tsinif
{
private:
int altdegisken;
public:
altsinif() : altdegisken(0) {}
altsinif(int a,int b) : altdegisken(a)
{tdegisken = b;}
void yazdir()
{cout<<"altdegisken : "<< altdegisken <<endl;}
};
/*// MAIN Fonksiyonumuz //*/
int main()
{
tsinif *pTemel;
altsinif *pAlt;
pTemel = new tsinif(8);
pAlt = new altsinif(25,45);
pTemel = dynamic_cast<tsinif*>(pAlt);
pTemel->yazdir();
pTemel = new altsinif(18,37);
pAlt = dynamic_cast<altsinif*>(pTemel);
pAlt->yazdir();
system("pause");
}
Evet şimdi bu kodların ne işe yaradığını açıklayabiliriz.
#include<typeinfo> ile dynamic_cast operatörü için gerekli olan typeinfo başlık dosyasını ekliyoruz.
Ardından tsinif adında; temel sınıf vazifesi görecek olan sınıfımızı oluşturuyoruz. Sınıf değişkeninin protected olmasının nedeni türetilmiş sınıfın da bu değişkeni kullanacak olmasıdır.
tsinif() : tdegisken(0) {} kurucu fonksiyonu tanımladığımız tdegisken isimli değişkene 0 başlangıç değerini atıyor. Bu fonksiyon argüman almaz. Ancak bundan sonra gelen;
tsinif(int t) : tdegisken(t) {} kurucu fonksiyonu tek argümanlıdır. Bu fonksiyonu ise tdegisken e türetilmiş sınıf içerisinde değer atamakta kullanacağız.
virtual void sanal() {} ile temel sınıf olan tsinif içerisinde bir sanal fonksiyon oluşturulur. dynamic_cast kullanımı için temel sınıfta en az 1 tane sanal fonksiyon bulunması gerekir.Bu nedenle biz de sanal isminde sanal fonksiyonumuzu tanımladık.
Son olarak temel sınıfın - tdegisken in değerini ekrana yazdıracak olan - goster isimli üye fonksiyonunu tanımlıyoruz.
Sıra geldi türetilmiş sınıfa.. altsinif ismindeki sınıfı temel sınıfımız olan tsinif tan türetiyoruz. Ardından altdegisken isimli değişkeni, bu sefer private olarak tanımlıyor ve ilk değer olan 0 ı atıyoruz. Daha sonra ise iki argümanlı altsinif(int a,int b) kurucu fonksiyonu altdegisken i ilk argümana; tdegisken i aldığı ikinci argümana eşitliyor. Yine türetilmiş sınıfın sonunda, temel sınıftaki ile aynı işlevi görecek olan goster isimli üye fonksiyonu tanımladık.
Artık sıra main() fonksiyonunda ve dynamic_cast ile tip dönüşümlerini gerçekleştirmekte..
İlk başta temel sınıf ve türetilmiş sınıfa işaret eden pTemel ve pAlt değişkenlerimizi tanımlıyoruz ve bunlar için bellekte yer ayırıp (new) ait oldukları sınıfların kurucu fonksiyonları yardımı ile ilk değer atamasını yapıyoruz.
Evet. Yukarıda pAlt = new altsinif(25,45); yardımıyla temel sınıfın tsinif değişkeni 25, türetilmiş sınıfın altsinif değişkeni 45 değerini alıyor. Ve pAlt isimli türetilmiş sınıfa işaret eden değişken bu değerleri tutuyor.
Şimdiki aşamada dynamic_cast ile işaretçi tiplerini değiştireceğiz. Bu arada şuna değineyim: dynamic_cast kalıtımda yukarı veya aşağı doğru tip dönüşümü imkanı sağlar.Yukarı yönde dönüşüm türetilmiş sınıf nesnesini , temel sınıfın nesnesine dönüştürme anlamına gelir. Aşağı yönde dönüşüm de bunun tersidir.
dynamic_cast ile dönüşümü pTemel = dynamic_cast<tsinif*>(pAlt); kullanarak sağladık. Burada pTemel artık; pAlt değişkeninin tuttuğu; temel sınıfın parçasına işaret eder. Yukarıda ; pAlt = new altsinif(25,45); ile temel sınıfın tdegisken isimli üye değişkenine ikinci argümanı, yani 45 değerini atamıştık. pTemel'in pAlt içindeki temel sınıf parçasına işaret ettiğinde bu değere sahip olmuş olur ve pTemel->yazdir(); kullanarak ekrana yazdırdığımızda şu çıktıyı görürsünüz:
tdegisken : 45
Yukarı yönde tip dönüşümünü gerçekleştirdik. Göreceğiniz üzere main fonksiyonunda ikinci bir tip dönüşümü daha uyguladık. Bu da aşağı yönde dönüşüme örnektir.