1. KBUZEM
Karabük Üniversitesi
Uzaktan Eğitim Araştırma ve Uygulama Merkezi
8. Çokbiçimlilik (Polymorphism)
Nesne yönelimli programlamada üç önemli kavram bulunmaktadır. Bunlar sırası ile Sınıflar,
Kalıtım ve Çokbiçimlilik dir. Çokbiçimlilik sanal(virtual) fonksiyonlarla gerçekleştirilir.
Sanal fonksiyonların da temel sınıfa işaret eden işaretçilerle yakın ilişkisi vardır.
İşaretçiler ve türemiş sınıflar
8. HAFTA
NESNEYE DAYALI PROGRAMLAMA
2. BLM225
Nesneye Dayalı Programlama
2
Temel sınıf türünden bir işaretçi, türemiş sınıf türünden bir nesnenin adresini tutabilir.
Aşağıdaki örnekte P1, P2 işaretçilerinin Cokgen türünden olduğuna ve sırası ile Dortgen ve
Uçgen türünden nesnelerin adreslerini tuttuklarına dikkat ediniz. Ayrıca Hem temel sınıfta ve
hem de türemiş sınıfta tanımlanmış int Alan() fonksiyonu yer almaktadır. Bu fonksiyon
çağrıldığında hangi Alan fonksiyonu çağrılmış olacaktır. Eğer işaretçi kullanılmamış ise
çağıran nesne hangi sınıftan ise o sınıfın Alan fonksiyonu işlem görecektir. Aşağıdaki örnekte
D1.Alan(); ifadesinde
D1 dortgen türünden olduğu için D1 nesnesinin Alan fonksiyonu çağrılacaktır. Yani Türemiş
sınıfın Alan isimli fonksiyonu temel sınıfın aynı isimli fonksiyonunu
örtecektir(Gizleyecektir).
Aşağıda verilen ifadelerde P1 ve P2 Cokgen (temel sınıf) türünden işaretçiler olup, türemiş
sınıflar türünden tanımlanmış D1 ve U1 nesnelerinin adresini tutmaktadır.
Dortgen D1;
Ucgen U1;
Cokgen *P1=&D1;
Cokgen *P2=&U1;
P1->Alan(); P2->Alan() ; ifadeleri de temel sınıfın Alan fonksiyonunu çağıracaktır. Bunun
sebei P1 ve P2 nin temel sınıf türünden olmasıdır ve Çalışma anında (run time) sadece P1 ve
P2 işaretçilerinin türüne bakılması içeriğine yani nasıl bir nesnenin adresinin tutulduğuna
bakılmamasıdır. Amacımız türemiş sınıfın kendi Alan foksiyonlarını çağırması olduğuna göre
bu nasıl sağlanacaktır?
#include <iostream>
using namespace std;
class Cokgen {
public:
int genislik, yukseklik;
public:
void DegerVer(int a,int b) {
genislik=a; yukseklik=b;
}
int Alan() {return 0;}
};
class Dortgen : public Cokgen{ //Dorgen sınıfı Cokgen sınıfından turetiliyor
public:
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
2
3. BLM225
Nesneye Dayalı Programlama
3
int Alan () {return genislik*yukseklik;}
};
class Ucgen : public Cokgen{ //Ucgen sınıfı Cokgen sınıfından turetiliyor
public:
int Alan () {return (genislik*yukseklik)/2;}
};
int main ()
{
Dortgen D1;
Ucgen U1;
//P1, P2 işaretçilerinin Cokgen türünden olduğuna ve
// sırası ile Dortgen, Uçgen türünden nesnelerin
//adreslerini tutuklarına dikkat ediniz.
Cokgen *P1=&D1;
Cokgen *P2=&U1;
P1->DegerVer(3,4);
P2->DegerVer(7,8);
cout << P1->Alan()<<endl; //temel sınıfın Alan fonk. çağrılır
cout << P2->Alan()<<endl; //temel sınıfın Alan fonk. çağrılır
cout << D1.Alan()<<endl; //türemiş sınıfın Alan fonk. Çağrılıyor.
cout << U1.Alan()<<endl; //Alan fonk. Temel sınıfı örtüyor.
return 0;
}
Türemiş sınıfın kendi Alan fonksiyonunu çağırmasını sağlamak için temel sınıfta yer alan
Alan fonksiyonunun başına aşağıda görüldüğü gibi virtual(sanal) kelimesi getirilmesi
gerekmektedir.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
3
4. BLM225
Nesneye Dayalı Programlama
4
class Cokgen {
public:
int genislik, yukseklik;
public:
void DegerVer(int a,int b) {
genislik=a; yukseklik=b;
}
virtual int Alan() {return 0;}
};
Bu takdirde yukardaki programın ekran çıktısı şu şekildedir.
Başka bir örnek
#include <iostream>
#include <conio.h>
using namespace std;
class Cokgen {
public:
int genislik, yukseklik;
public:
void DegerVer(int a,int b) {
genislik=a; yukseklik=b;
}
virtual int Alan() {return genislik*yukseklik/3;}
};
class Dortgen : public Cokgen{ //Dorgen sınıfı Cokgen sınıfından turetiliyor
public:
int Alan () {return genislik*yukseklik;}
};
class Ucgen : public Cokgen{ //Ucgen sınıfı Cokgen sınıfından turetiliyor
public:
int Alan () {return (genislik*yukseklik)/2;}
};
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
4