Polimorfisme pada C++ - nblognlife

Polimorfisme pada C++

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'

Sedangkan output yang diinginkan adalah
FUNGSI VIRTUAL
--------------
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


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"


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,
  1. fungsi biasa;
  2. 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