Selamat Datang Di Anak Jadul Ingin Pintar (AJIP)

Belajar C++ Part 12

Selasa, 27 Desember 20110 komentar

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 :
Text Box: Kelas Dasarclass A
{
 public:

 tipe virtual fungsi_virtual();
};
class B : public A
{
Text Box: Kelas Turunan public:
 tipe fungsi_statis();
 tipe fungsi_virtual();
Ikatan Dinamis
 
};
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 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;
}


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 ()
{
 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 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;}
};
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:










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.

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;
}
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

Share this article :

Posting Komentar

 
Copyright © 2011. BELAJAR PEMOGRAMAN - All Rights Reserved
Proudly powered by Fasilkom Universitas Esa Unggul