com
14
FUNGSI VIRTUAL & POLIMORFISME
Pendefinisian fungsi virtual biasanya tidak begitu berarti, artinya kode – kode
yang terdapat pada fungsi virtual sifatnya general. Selanjutnya kelas turunan akan
mendefiniskan ulang fungsi visrtual tersebut. Apabila ada kelas turunan yang tidak
mendefinisikan ulang fungsi virtual tersebut maka fungsi yang digunakan adalah
fungsi virtual. Untuk lebih jelasnya perhatikan contoh program dibawah ini .
#include <iostream.h>
class Binatang
{
public: virtual void Makan()
{
cout << "Makan seperti binatang pada umumnya." << endl;
}
};
int main()
{
Binatang *Hewan[4];
Hewan[0] = new Binatang();
Hewan[1] = new Serigala();
Hewan[2] = new Ikan();
Hewan[3] = new BinatangLain();
Apabila kata virtual kita hilangkan maka hasil yang diberikan adalah
Makan seperti binatang pada umumnya.
Makan seperti binatang pada umumnya.
Makan seperti binatang pada umumnya.
Makan seperti binatang pada umumnya.
Perbedaan fungsi virtual dengan fungsi lainnya adalah terdapat pada cara
pemanggilan fungsi tersebut. Pemanggilan fungsi virtual adalah pada saat program
sedang jalan (run-time), sedangkan pemanggilan fungsi lainnya dilakukan pada saat
compile.
14.2 Polimorfisme
Polimorfisme sesuai dengan asal usul kata pembentuknya, berarti “mempunyai
banyak bentuk”. Dalam wujudnya polimorfisme dapat beroperasi pada dua aras,
yaitu saat pengompilasian dan saat pengeksekusian. Overlooding terhadap fungsi
dan operator merupakan bentuk polimorfisme saat pengompilasian.
Konstruksi ini memungkinkan untuk mengadakan ikatan dinamis (juga disebut ikatan
tunda, atau ikatan akhir). Kalau fungsi-fungsi dari suatu kelas dasar didefinisikan
ulang atau ditindih pada kelas turunan, maka objek-objek yang dihasilkan hirarki
kelas berupa objek polimorfik. Polimorfik artinya mempunyai banyak bentuk atau
punya kemampuan untuk mendefinisi banyak bentuk.
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;
}
};
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
Perhatikan hasil didepan dan juga fungsi-fungsi anggota kelas yang ada pada ketiga
kelas(Makhluk, Mamalia dan Sapi). Pertama-tama kelas mamalia mewarisi mahluk
dan sapi mewarisi mamalia. Kemuian pada pendeklarasian kelas mahluk, perbedaan
yang menyolok antara fungsi anggota informasi() dan keterangan() terletak pada
kata-kata kunci virtual(yang lainnya tentu saja berupa perbedaan string yang akan
ditampilkan oleh cout). Pada kelas mamalia dan sapi, perbedaan yang nyata tidak
ada, kecuali perbedaan dalam hal string.
Sekarang kita lihat pada bagian main(). Mula-mula terdapat penciptaan obyek
berkelas mamalia dan sapi dan pointer yang menunjuk ke kelas mahluk. Kemudian
pointer ini diatur agar menunjuk ke obyek dinamis berkelas mamalia. Saat fungsi
anggota informasi() dipanggil dari pointer, ternyata yang ditampilkan adalah fungsi
anggota dari kelas mahluk. Tetapi tidak demikian halnya dengan keterangan().
Binatang → keterangan()
main ()
{
A*pa;
pa=new A;
cout<<"Objek pa berbentuk objek kelas A"<<endl
<<pa->fungsi_statis()<<endl
<<pa->fungsi_virtual()<<endl<<endl;
delete pa;
pa=new B;
cout<<"Objek pa berbentuk objek kelas B"<<endl
<<pa->fungsi_statis()<<endl
<<pa->fungsi_virtual()<<endl<<endl;
delete pa;
pa=new C;
cout<<"Objek pa berbentuk objek kelas C"<<endl
<<pa->fungsi_statis()<<endl
<<pa->fungsi_virtual()<<endl<<endl;
delete pa;
}