c++’da polymorphism kavramı
08 Mayıs 2010 – 12:30polymorhism 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

