Polimorfisme pada C++
By
Rachmat Santoso
—
Senin, 03 Juli 2017
—
Cplusplus
Contoh Program Polimorfisme pada C++ |
Polimorfisme
artinya “memiliki banyak bentuk”, maksudnya satu hal yang sama dapat memiliki
beberapa bentuk yang berbeda.
Terdapat
dua tipe polimorfisme, yaitu saat pengkompilasian (compile time) dan saat runtime.
Polimorfisme saat pengkompilasian (compile time) dalam hal ini adalah overloading
pada fungsi dan overloading pada operator yang pernah saya bahas di
postingan sebelumnya (Baca C++ - Konsep Overloading Terhadap Fungsi dan C++ -Overloading terhadap Operator).
Sedangkan untuk polimorfisme saat runtime akan dibahas pada postingan
ini.
Pada
polimorfisme saat runtime, fungsi pada kelas dasar di deklarasikan untuk umum,
selanjutnya secara spesifiknya akan diterangkan kembali pada kelas turunan.
Analoginya,
semua binatang memiliki suara maka pada kelas dasar diciptakan variabel dan
fungsi untuk menampilkan suara. Namun seperti yang kita ketahui setiap jenis
binatang memiliki suara yang berbeda, sehingga pada kelas turunan ditulis kembali suara
yang khas dari jenis binatang tersebut.
Contoh
lain, seorang raja (kelas dasar) mempunyai uang yang akan diberikan
(diwariskan/diturunkan) ke anak kecil (kelas turunan) dan orang tua (kelas
turunan). Uang beserta jumlahnya sama, namun perlakukannya dapat berbeda-beda
(memiliki banyak bentuk). Oleh anak kecil uang tersebut digunakan untuk membeli
mainan dan atau semua yang diinginkan. Oleh orang tua uang tersebut digunakan
untuk membeli semua yang dibutuhkan termasuk kebutuhan anaknya.
Jika
masih belum jelas dengan yang saya sampaikan, baca konsep overriding untuk lebih memudahkan memahami polimorfisme tipe
ini.
Sebelum
masuk ke contoh program polimorfisme saat runtime, kita harus mengetahui
terlebih dahulu tentang fungsi virtual.
Mengapa demikian? Karena fungsi virtual menjadi dasar untuk melakukan
polimorfisme.
FUNGSI
VIRTUAL
Perhatikan contoh program berikut ini!
/*
Fungsi Virtual
Microsoft Visual Studio Express 2012
[RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;
//kelas dasar
class Huruf
{
public :
void info()
{
cout<<"Informasi kelas dasar 'Huruf'"<<endl;
}
};
//kelas turunan
class A : public Huruf
{
public :
void info()
{
cout<<"Informasi kelas turunan 'A'"<<endl;
}
};
//kelas turunan
class B : public Huruf
{
public :
void info()
{
cout<<"Informasi kelas turunan 'B'"<<endl;
}
};
int main()
{
//deklarasi objek
Huruf *obj_huruf; //pointer ke objek berkelas Huruf
A obj_a;
B obj_b;
cout<<"FUNGSI VIRTUAL"<<endl;
cout<<"--------------"<<endl;
//menunjuk ke objek dari kelas A
obj_huruf = &obj_a;
/*
Karena obj_huruf telah
menunjuk objek dari kelas A (obj_a), maka pernyataan di bawah ini artinya
fungsi info yang dipanggil adalah fungsi info pada kelas A
*/
obj_huruf->info();
//DIUBAH, sekarang obj_huruf menunjuk ke objek dari kelas
B
obj_huruf = &obj_b;
/*
Karena obj_huruf SEKARANG
telah menunjuk objek dari kelas B (obj_b), maka pernyataan di bawah ini artinya
fungsi info yang dipanggil adalah fungsi info pada kelas B
*/
obj_huruf->info();
_getche();
return 0;
}
Output
FUNGSI VIRTUAL
--------------
Informasi kelas dasar 'Huruf'
Informasi kelas dasar 'Huruf'
--------------
Informasi kelas dasar 'Huruf'
Informasi kelas dasar 'Huruf'
Sedangkan output yang diinginkan adalah
FUNGSI VIRTUAL
--------------
Informasi kelas turunan 'A'
Informasi kelas turunan 'B'
--------------
Informasi kelas turunan 'A'
Informasi kelas turunan 'B'
Lalu, bagaimana caranya? Di
sinilah keberadaan fungsi virtual dibutuhkan. Tambahkan reserved word “virtual”
di depan fungsi info pada kelas dasar Huruf, seperti terlihat pada potongan
kode di bawah ini.
//kelas dasar
class Huruf
{
public :
virtual void info()
{
cout<<"Informasi kelas dasar 'Huruf'"<<endl;
}
};
Compile ulang dan perhatikan
perbedaan output program sebelum dan setelah penggunaan fungsi virtual.
Bentuk penulisan fungsi virtual:
virtual <tipe> <nama_fungsi>()
{
...
}
Fungsi virtual murni
Jika kita diperhatikan, keberadaan isi/body dari fungsi virtual info() pada kelas dasar Huruf tidak
memiliki arti karena tidak akan ditampilkan. Oleh sebab itu kita bisa
menjadikannya sebagai fungsi virtual murni. Dengan menjadikan virtual murni,
kita memberitahu compiler bahwa fungsi virtual tersebut tidak memiliki body
fungsi.
Cara menjadikan fungsi virtual menjadi
fungsi virtual murni adalah dengan menambahkan = 0 dan menghilangkan body
fungsi, seperti terlihat pada potongan code di bawah ini.
//kelas dasar
class Huruf
{
public :
virtual void info() = 0
};
Penting!
Jika suatu kelas setidaknya memiliki sebuah fungsi virtual murni
maka kelas tersebut disebut dengan kelas abstrak. Pada kelas abstrak tidak
diperbolehkan untuk menciptakan objek. Sehingga pernyataan Huruf obj_huruf; tidak
diperbolehkan, yang diperbolehan adalah pointer ke objek berkelas Huruf, yaitu Huruf *obj_huruf;. Ingat,
hal ini berlaku jika kelas tersebut adalah kelas abstrak.
POLIMORFISME
Setelah memahami fungsi virtual, sekarang
saatnya masuk ke contoh progam lain yang menerapkan polimorfisme. Mengapa saya
bilang contoh program lain, karena sebenarnya contoh program di atas
sudah menerapkan konsep polimorfisme.
Contoh Program Polimorfisme 1
Berikut adalah code program
Polimorfisme 1.
/*
Polimorfisme pada C++
Microsoft Visual Studio Express 2012
[RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;
//Kelas Dasar Ular (Kelas Abstrak)
class Ular
{
protected:
char nama[20];
public:
//fungsi virtual murni
virtual void info_bisa() = 0;
};
//kelas Phyton turunan dari kelas Ular
class Phyton : public Ular
{
public:
Phyton(char* nm)
{
strcpy(nama, nm);
}
void info_bisa()
{
cout<<"Ular "<<nama<<" tidak memiliki bisa";
}
};
//kelas Cobra turunan dari kelas Ular
class Cobra : public Ular
{
public:
Cobra(char* nm)
{
strcpy(nama, nm);
}
void info_bisa()
{
cout<<"Ular "<<nama<<" memiliki bisa";
}
};
int main()
{
//deklarasi objek
Ular *obj_ular;
Phyton ptn("Phyton");
Cobra cbr("Cobra");
cout<<"POLIMORFISME 1"<<endl;
cout<<"--------------"<<endl;
//menunjuk ke objek dari kelas Phyton
obj_ular = &ptn;
obj_ular->info_bisa();
cout<<endl;
//menunjuk ke objek dari kelas Cobra
obj_ular = &cbr;
obj_ular->info_bisa();
_getche();
return 0;
}
Output
POLIMORFISME 1
--------------
Ular Phyton tidak memiliki bisa
Ular Cobra memiliki bisa
--------------
Ular Phyton tidak memiliki bisa
Ular Cobra memiliki bisa
Contoh Program
Polimorfisme 2
Berikut adalah code program Polimorfisme 2.
/*
Polimorfisme pada C++
Microsoft Visual Studio Express 2012
[RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;
//Kelas Dasar Ular (Kelas Abstrak)
class Binatang
{
protected:
char nama_binatang[20];
char suara_b[20];
public:
void informasi()
{
cout<<"Informasi Binatang"<<endl;
}
//fungsi virtual murni
virtual void namaBinatang() = 0;
virtual void suara() = 0;
};
//kelas Kucing turunan dari kelas Binatang
class Kucing : public Binatang
{
public:
Kucing(char* nm, char *sr)
{
strcpy(nama_binatang, nm);
strcpy(suara_b, sr);
}
void informasi()
{
cout<<"Informasi Kucing"<<endl;
}
void namaBinatang()
{
cout<<"Nama : "<<nama_binatang<<endl;
}
void suara()
{
cout<<"Suara : \""<<suara_b<<"\""<<endl;
}
};
//kelas Bebek turunan dari kelas Binatang
class Bebek : public Binatang
{
public:
Bebek(char* nm, char *sr)
{
strcpy(nama_binatang, nm);
strcpy(suara_b, sr);
}
void informasi()
{
cout<<"Informasi Bebek"<<endl;
}
void namaBinatang()
{
cout<<"Nama : "<<nama_binatang<<endl;
}
void suara()
{
cout<<"Suara : \""<<suara_b<<"\""<<endl;
}
};
int main()
{
//deklarasi objek
Binatang *obj_bnt;
Kucing kcg("Kucing", "meow meow");
Bebek bbk("Bebek", "kukuruyuk");
cout<<"POLIMORFISME 2"<<endl;
cout<<"--------------"<<endl;
//menunjuk ke objek dari kelas Kucing
obj_bnt = &kcg;
obj_bnt->informasi();
obj_bnt->namaBinatang();
obj_bnt->suara();
cout<<endl;
//menunjuk ke objek dari kelas Bebek
obj_bnt = &bbk;
obj_bnt->informasi();
obj_bnt->namaBinatang();
obj_bnt->suara();
_getche();
return 0;
}
Output
POLIMORFISME 2
--------------
Informasi Binatang
Nama : Kucing
Suara : "meow meow"
Informasi Binatang
Nama : Bebek
Suara : "kukuruyuk"
--------------
Informasi Binatang
Nama : Kucing
Suara : "meow meow"
Informasi Binatang
Nama : Bebek
Suara : "kukuruyuk"
Penjelasan Polimorfisme 2
Program di atas merupakan program dari
analogi yang sebelumnya saya sampaikan di awal postingan ini.
Perhatikan! pada kelas dasar
Binatang terdapat dua fungsi yang berbeda,
- fungsi biasa;
- fungsi virtual murni;
Sekarang perhatikan output program, ketika
obj_bnt->informasi(); dijalankan hasilnya adalah string “Informasi Binatang”.
Kenapa bukan “Informasi Kucing/Bebek” padahal pointer sudah
menunjuk pada kelas turunan Kucing/Bebek? Hal ini
dikarenakan kata “virtual” tidak ditambahkan pada fungsi informasi() yang ada
pada kelas dasar Binatang (*sekedar
mengulang apa yang saya jelaskan di awal). Dan jangan lupa juga bahwa
fungsi informasi() dari kelas dasar Binatang telah diwariskan ke kelas turunan.
Semoga bermanfaat.
Baca juga:
[RS]
Klik Like & Share jika postingan ini bermanfaat
Apa tanggapan Anda?
Berikan tanggapan Anda melalui kolom komentar yang telah disediakan.
- Gunakan bahasa yang sopan;
- Saat menjadikan postingan pada blog ini sebagai referensi, jangan lupa mencantumkan sumbernya (link dari blog ini).
Jika blog ini bermanfaat jangan lupa memberikan 'like' atau 'share' untuk mendapatkan update terbaru.
Terima kasih