c++’da polymorphism kavramı

08 Mayıs 2010 – 12:30

           polymorhism nedir?

polymorphism’in  türkçesi çokbiçimliliktir,

çok biçimlilik  sözcüğünü duyduğımuzda aklımıza  tek bir  şeyin farklı kullanımlara farklı yanıtlar vermesi  gelebilir.bunu sınıf  kullanımına indirgediğimizde ise birbiriyle kalıtımla ilişkisi olan farklı sınıfların nesnelerinin aynı üye   fonksiyon çağrısına farklı yanıt vermesi  şeklinde açıklayabiliriz.

           polymorphism nasıl kullanılır?

bunun için bir base classımız olmalı(temel sınıf),ve ondan kalıtımla oluşan derived classlar(türetilmiş sınıflar).

base classda oluşturulan bir  fonksiyon diğer sınıflarından hepsinde de kullanılacak ama bu  fonksiyonların herbirinin içeriği  farklı olacak.

base classda tanımladığımız ve bütün classlar için ortak kullanmak istediğimiz fonksiyonu base classda tanımlarken bunu “virtual”  olarak tanımlayıp,kullanmalıyız.diğer classlara  tanımlama  yaparken ise  normal tanımlama yapılmalıdır.

base classdaki tanımlama:

        public  virtual string speak() const

kalıtılmış  sınıftaki tanımlama:

        public string speak() const

mainde  bunu kullanacakken de alt sınıflardan nesne oluşturup bunu base classın pointer’ına ya  adresine eşitlemek  gerekir.

dog kucik  //dog derived class,pet  base class

pet *p1=&kucik

ya da

pet &p2=kucik

şeklinde kullanılır

                   polymorphismin ne fayda sağlar?

 aynı fonksiyonu kullanacak yeni bir alt class eklendiğinde de  fonksiyonun içeriğini tekrardan yazmak zorunda kalmacağız.

bu  söylediğimiz  durum tabiki  büyük projelerde avantaj sağlayacaktır,temel bir  içeriğie  sahip  fonksiyon var ve  buna herbir  oluşturulan classda yeni özellikler ekleniyor.

şimdi deitelin kitabında olan bir  kodu beraber inceleyelim:

header  dosyası

//pet base classındaki speak()  normal kullanılsa dog’dan nesne  oluşturulup
//speak kullanıldığında hep pet’teki speak fonksiyonunu çalıştıracaktı,
//bunu engellemek içik için base classdaki speak()   fonksiyonunu  virtual yapmalıyız,
//böylece  kimden nesne  oluşturulsa hangisi speaki  seçeceğine  karar verebilir

 
#pragma once
#include <iostream>
using namespace std;

class pet
{
public:
 virtual string speak() const                        //ortak kullanılacak fonksiyon
 {   return    ”";
 
 }
 
};
class dog:public pet
{
public:
   string speak() const{               //bu  fonksiyonda virtual olabilirdi,ozman adres pointer atamalarına gerek kalmazdı
 return “bark”;
 }

};

main dosyası

#include <iostream>
#include<string>
#include “pet.h”

using namespace std;
int main(){
 int x;
dog  kucik;

      //eğer  dog daki   speak() fonksiyonu da  virtual olsaydı;
      //ozaman  adres pointer atamalarına gerek kalmadan dog kendi  fonksiyonunu direk kullanabilirdi
      //cout<<”dogun nesnesi:”<<kucik.speak()<<endl;   output:bark
      //pet f;
      //cout<<”petin nesnesi:”<<f.speak()<<endl;  output: 

 

pet *p1=&kucik;                       //dogdan oluşturduğu nesnesinin adresini petin pointerına eşitliyorr,
                  //böylce p1 dogun speak() fonksiyonunu kullanabilir
pet &p2=kucik;                                                 //p1 atamasıyla aynı  oluyor,kullanımı farklı sadece
pet p3;                                                               //direk  p3ten nesne oluşturmuş

cout<<”p1->speak=”<<   p1->speak()   <<endl;                      //p1  pointer olduğu için p1->  diye kullanıyor
cout<<”p2->speak=”<<p2.speak()<<endl;                               //p2 pointer değil  p2.   diye kullanıyor
cout<<”p3.speak=”<<p3.speak()<<endl;
cin>>x;

}

DERYA GÜNDÜZ

http://www.deryagunduz.blogspot.com

mikroskosmos@hotmail.com

deryagunduz47@hotmail.com

Bookmark and Share

Post a Comment

Subscribe without commenting