19 Aralık 2012 Çarşamba

ÇOK BİÇİMLİLİK(POLYMORPHISM)



Polymorphism,birbiriyle kalıtım ilişkisi olan farklı sınıfların nesnelerinin aynı üye metot çağrısına farklı cevap vermesidir.Kısacası bir nesnenin farklı bir nesne gibi davranmasıdır.
Polymorphism daha genel bir program yazmak için kullanılır.
Polymorphism anlaşılması zor bir konu olduğu için basit bir uygulama üzerinden anlatarak devam edeceğim.























virtual function(sanal fonksiyon) : Sanal fonksiyonlar virtual anahtar kelimesinin fonksiyon prototipinin başına getirilmesiyle oluşturulur.virtual kelimesi sadece prototipte yazılır.Yani fonksiyon tanımlandığında yazılmaz.Ana sınıfta bir fonksiyonu virtual yapmak demek türetilmiş sınıflardaki aynı prototipe sahip fonksiyonları da virtual yapmak demektir.
virtual fonksiyonlar neden kullanılır? Ana sınıftan oluşturulan gösterici türetilmiş  sınıftan oluşturulan nesnenin adresini işaret etsin.Bu göstericiyle de fonksiyonları çağırmaya başlayalım.Eğer her iki sınıfta (base ve derived) aynı fonksiyonlara sahip  ve bunlardan biri virtual olsun.virtual olmayan fonksiyon göstericiyle çağrılsın.Bu durumda ana sınıfın fonksiyonu çağrılır.Ancak virtual fonksiyon gösterici ile çağrılırsa bu  sefer göstericinin adresini işaret ettiği sınıfın fonksiyonu çağrılır.Dikkat edilirse burada program  derlendiği zaman hangi programın çağrılacağına karar verilmektedir(Late Binding)

Gelelim yukarıdaki Base sınıfımıza.Burada  f1() fonksiyonu sadece virtualdır.






















Derived sınıfımızda da Base sınıfımızda bulunan f1() sanal (virtual) fonksiyonu bulunmaktadır.Ek olarak f2(int),g1() fonksiyonları bulunmaktadır.f2(int ) fonksiyonu  Base sınıftaki ile aynı fonksiyonlar değildir çünkü prototipleri farklıdır.Function overloading yapılmıştır.









Burada da sadece f1() fonksiyonunu çağıran bir fonksiyon yazdım.























ve işte main bölümümüz.Şimdi tüm taşlar yerine oturacaktır...

  • İlk olarak Base ve Derived  sınıflarımızdan b ve d nesnelerini oluşturduk.b ile Basedeki ,d ile Deriveddaki metotlarımızı çağırdık.Herkes kendi fonksiyonlarını çağırır bu durumda.
  • Base *ptr;   ptr=&d;  satırlarıyla ptr pointerının d nesnesinin adresini işaret etmesini sağladık.ptr f1() fonksiyonu çağırırken Deriveddaki f1() fonksiyonuna gider çünkü f1() fonksiyonumuz virtual tanımlanmıştı.Ancak f2() fonksiyonu virtual olmadığı için ptr bencil davranıp madem virtual yapmadın o zaman bende kendi sınıfıma giderim deyip direk kendi tanımlandığı sınıfın yani Base sınıfın f2() fonksiyonunu çağırıyor.Yani virtual bencilliğinde önüne geçiyor diyebiliriz:)
  • Diğer bir konuysa, ptr ile yani Base sınıfın göstericisiyle her ne kadar Derived sınıfın adresini de gösteriyor olsa da Base de olmayan fonksiyonu çağıramıyor olmanızdır.
  • Polymorphism function overloadingede izin vermiyor.Yani programdaki gibi f1(4)  fonksiyonu overlaoded edilmiş ancak hata verir.
  • Son olarak  call_f1(d) ve call_f1(b) fonksiyonlarına gelelim.Bu fonksiyon ile polymorphism yapısının kullanışlı özeliğini de görmüş oluyoruz.Nesneler referans  tipinde oldukları için metotlara gönderebiliriz.Aslında mainde pointer oluşturup nesnenin adresini işaret ettirmek ve daha sonra çağırma işlemini yapmak yerine bunu tek satırda bir fonksiyonla çözmek  polymorphismnin en güzel yanı...
Program çıktısı...



1 yorum: