You are on page 1of 11

Modul Bahasa C++, harni_kus@yahoo.

com

13 POLIMORFISME

Polimorfisme (polymorphism) erat kaitannya dengan Pewarisan. Polimorfisme
adalah pemikiran bahwa objek dinamis suatu kelas dasar dapat berperilaku seperti kelas
turunan. Ketika objek tersebut menunjuk kelas dasar, objek tersebut berperilaku seperti
kelas dasar, tetapi ketika objek tersebut menunjuk kelas turunan, objek tersebut
berperilaku seperti kelas turunan. Dalam hal ini objek dapat memiliki beberapa bentuk,
tergantung pada saat itu kelas mana yang ditunjuk. Yang perlu menjadi catatan, bahwa
perubahan perilaku ini dari kelas dasar kepada kelas turunan, tidak dapat objek kelas
turunan menunjuk kelas dasar.
Polimorfisme dimungkinkan karena adanya mekanisme ikatan dinamis (dynamic
binding). Ikatan dinamis adalah ikatan yang terjadi pada saat program dijalankan (run-
time). Ikatan yang terjadi pada saat kompile disebut ikatan statis. Ikatan dinamis hanya
dapat terjadi antara suatu objek dinamis dengan metode yang dinamis juga, dalam hal
ini metode virtualnya (maya).

A. Polimorfisme Pada Pewarisan Tunggal
Suatu metode dapat dideklarasikan secara virtual dengan cara menambah kata
virtual pada deklarasi fungsi. Jika suatu metode dideklarasikan secara virtual dalam
kelas dasar, maka keadaan virtual tetap akan berlaku untuk fungsi yang sama di seluruh
kelas turunan meskipun kata virtual tidak disebutkan.
Untuk menjelaskan tentang ikatan dinamis dalam hubungannya dengan
polimorfisme, perhatikan rancangan kelas berikut ini :

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com

class A
ar
{
Das
elas public:
K tipe fungsi_statis();
tipe virtual fungsi_virtual(); Ikatan Statis

};
class B : public A
{

n public:
una tipe fungsi_statis();
Tur tipe fungsi_virtual();
elas
};
Ikatan Dinamis
K
class C : public B
{
public:
tipe fungsi_statis();
tipe fungsi_virtual();
};

Hirarki kelas yang digambarkan oleh rancangan kelas diatas berupa Pewarisan
Tunggal. Jika diciptakan objek dinamis kelas A, maka objek ini dapat diubah bentuknya
menjadi (menunjuk) objek kelas B dan objek kelas C. Jika diciptakan objek dinamis kelas
B, maka objek ini dapat diubah bentuknya menjadi objek kelas C tetapi tidak dapat
diubah menjadi objek kelas A. Sehingga perubahan bentuk hanya berlaku dari kelas
dasar menjadi kelas turunan. Pada masing-masing kelas terdapat metode fungsi_statis()
dan fungsi_virtual(). Meskipun secara eksplisit fungsi virtual() hanya dideklarasikan
secara virtual pada kelas A, secara otomatis fungsi_virtual() pada kelas B dan kelas C
juga berupa fungsi virtual.
Jika diciptakan objek dinamis kelas A, maka objek ini dapat diubah bentuknya
menjadi objek kelas B dan kelas C, sehingga ikatan dinamis hanya dapat terjadi antara
objek tersebut dengan fungsi_virtual() dari kelas A, fungsi_virtual() dari kelas B dan
fungsi_virtual() dari kelas C. Ikatan dinamis tidak mungkin terjadi dengan fungsi_statis
dari kelas B maupun kelas C.
Jika yang diciptakan objek dinamis kelas B, maka objek ini hanya dapat
mengadakan ikatan dinamis dengan fungsi_virtual() dari kelas C saja. Hal ini sesuai

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com
aturan bahwa perubahan bentuk objek hanya dapat dari objek dinamis kelas dasar
menjadi objek dinamis kelas turunan.
#include<iostream.h>
class KARYAWAN
{
public:
virtual void Bekerja()=0;
};
class PROGRAMMER:public KARYAWAN
{
public:
void Bekerja()
{
cout<<”Bekerja dengan cara membuat program”;
cout<<endl;
}
};
class GURU:public KARYAWAN
{
public:
void Bekerja()
{
cout<<”Bekerja dengan cara mengajar didepan kelas”;
cout<<endl;
}
};
int main()
{
KARYAWAN *P;
P = new PROGRAMMER;
P ->Bekerja();
delete P; //menghapus pointer P yang menunjuk ke tipe
PROGRAMMER
P = new GURU;
P ->Bekerja();
return 0;
}

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com

B. Polimorfisme Pada Pewarisan Jamak
Polimorfisme juga dapat diterapkan pada pewarisan jamak, tidak ada bedanya
dengan pada Pewarisan Tunggal, hanya saja kata virtual harus disebutkan pada semua
metode pada kelas dasar yang dirancang dapat mengadakan ikatan dinamis.
Misalnya Polimorfisme diterapkan pada kelas pegasus, yang mana pegasus
dianggap sebagai kelas turunan dari kelas kuda dan burung. Jika diterapkan
Polimorfisme, maka harus diambil pengertian bahwa berlarinya kuda berbeda dengan
berlarinya pegasus. Demikian juga terbangnya burung berbeda dengan terbangnya
Pegasus. Dalam implementasi program, definisi fungsinya berbeda. Implementasi
program untuk kelas Pegasus dengan penerapan pewarisan jamak dan polimorfisme
dapat dituliskan sebagai berikut. :

#include<iostream.h>
class kuda
{
public:
void virtual berlari()
{cout<<"berlari cepatnya kuda"<<endl;}
};
class burung
{
public:
void virtual terbang()
{cout<<"terbang tingginya burung"<<endl;}
};
class pegasus: public kuda, public burung
{
public:
void berlari()
{cout<<"berlari cepatnya pegasus"<<endl;}
void terbang()
{cout<<"terbang tingginya pegasus"<<endl;}
};
main ()
{

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com
kuda *pkd;
pkd=new kuda;
cout<<"Sifat-sifat kuda : "<<endl;
pkd->berlari();
delete pkd;
pkd = new pegasus;
cout<<endl<<"Sifat-sifat pegasus : "<<endl;
pkd->berlari();
burung *pbr;
pbr=new burung;
cout<<endl<<"Sifat-sifat kuda : "<<endl;
pbr->terbang();
delete pbr;
pbr=new pegasus;
cout<<endl<<"Sifat-sifat pegasus : "<<endl;
pbr->terbang();
}

Hasil Eksekusi:

Program diatas menunjukan bahwa objek dinamis pkd dari kelas dasar kuda
dapat berbentuk kelas Pegasus. Demikian juga objek dinamis pbr dari kelas dasar
burung dapat berbentuk kelas Pegasus. Tetapi objek dinamis pkd tidak dapat berbentuk
kelas burung, begitu juga sebaliknya, objek dinamis pbr dari kelas burung tidak dapat

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com
berubah bentuk menjadi kelas kuda. Sehingga peryataan di bawah ini akan
menyebabkan kesalahan :
pkd = new burung; // salah
pbr = new kuda; // salah
Dapat dilihat, ketika objek pkd berbentuk kuda, maka metode berlari() yang
dijalankan adalah metode dari kelas kuda. Ketika objek pkd diubah menjadi berbentuk
kelas pegasus, metode berlari() yang dijalankan adalah metode dari kelas pegasus.

Demikian juga untuk obek dinamis pbr, ketika berbentuk kelas burung, metode
terbang() yang dijalankan adalah metode dari kelas burung. Ketika objek pbr diubah
bentuk menjadi kelas pegasus. Metode terbang() yang dijalankan adalah metode dari
kelas pegasus.

C. Polimorfisme Pada Pewarisan Jamak Virtual
Polimorfisme pada pewarisan jamak virtual juga tidak banyak berbeda. Berikut ini
contoh polimorfisme pada kelas hewan sampai Pegasus. Untuk menyederhanakan
program, hanya diperhatikan metode bergerak() pada kelas hewan. Metode bergerak ()
pada kelas hewan berbeda dengan metode bergerak pada kelas kuda, burung atau
pegasus. Kelas kuda memberi pengertian bergerak secara umum yaitu berpindah
tempat. Kelas kuda memberi pengertian bergerak dengan cara berlari, kelas burung
memberi pengertian bergerak dengan cara terbang atau berlari.
Perhatikan implementasi program berikut, serta perhatikan definisi metode pada
masing-masing kelas. Kata virtual hanya dipakai pada metode bergerak pada kelas
hewan sebagai tanda bahwa metode tersebut bersifat dinamis.

#include<iostream.h>
class hewan
{
public:
void virtual bergerak()
{cout<<"bergeraknya hewan secara umum"<<endl;}
};
class kuda : virtual public hewan
{
public:
void bergerak()
{cout<<"bergeraknya kuda dengan berlari"<<endl;}

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com
};
class burung: virtual public hewan
{
public:
void bergerak()
{cout<<"bergeraknya burung dengan terbang"<<endl;}
};
class pegasus: public kuda, public burung
{
public:
void bergerak()
{cout<<"bergeraknya pegasus dengan terbang dan berlari"<<endl;}
};
main ()
{
hewan *phw;
phw=new hewan;
cout<<"objek phw berbentuk hewan : "<<endl;
phw->bergerak();
phw=new kuda;
cout<<endl<<"objek phw berbentuk kuda : "<<endl;
phw->bergerak();
phw=new burung;
cout<<endl<<"objek phw berbentuk burung : "<<endl;
phw->bergerak();
phw=new pegasus;
cout<<endl<<"objek phw berbentuk pegasus : "<<endl;
phw->bergerak();
}

Hasil Eksekusi:

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com

Pada program tersebut dideklarasikan phw berupa objek dinamis kelas hewan.
Ketika objek phw berbentuk (menunjuk) kelas hewan, metode bergerak() yang
dijalankan adalah metode kelas dari hewan. ketika objek phw berbentuk kelas kuda,
metode bergerak() yang dijalankan adalah metode dari kelas kuda. Ketika objek phw
berbentuk kelas burung, metode bergerak() yang dijalankan adalah metode dari kelas
burung. Ketika objek phw berbentuk kelas pegasus, metode bergerak() yang dijalankan
adalah metode dari kelas pegasus.

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com
Contoh lain:
CONTOH PROGRAM
#include<iostream.h>
#include<conio.h>
#include<stdio.h>

class mahluk
{
public :
void informasi()
{
cout<<"Informasi()pada mahluk..."<<endl;
}
virtual void keterangan()
{
cout<<"Keterangan()pada mahluk..."<<endl;
}
};
class mamalia:public mahluk
{
public :
void informasi()
{
cout<<"informasi() pada mahluk..."<<endl;
}
void keterangan()
{
cout<<"Keterangan() pada mamalia..."<<endl;
}
};
class sapi : public mamalia
{
public :
void informasi()
{
cout<<"informasi() pada Sapi..."<<endl;
}

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com
void keterangan()
{
cout<<"Keterangan()pada Sapi..."<<endl;
}
};

void main()
{
clrscr();
mamalia mamalia;
sapi sapi_sumba;
mahluk*binatang;

cout<<endl<<endl;
binatang = &mamalia;
binatang-> informasi();
binatang ->keterangan();

cout<<"--------------"<<endl;

binatang= &sapi_sumba;
binatang-> informasi();
binatang ->keterangan();

getch();
}

HASIL EKSEKUSI

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++
Modul Bahasa C++, harni_kus@yahoo.com

Pusat Pengembangan Bahan Ajar - UMB Lucky E. Santoso.
BAHASA C++