Dalam hal ini obkjek memiliki beberapa bentuk, tergantung ia menunjuk kemana. Dalam hal ini suatu objek atau class dan perubahan perilakunya adalah dari kelas dasar ke kelas turunan, tidak bisa objek kelas turunan menunjuk ke kelas dasar. Polimorfisme dimungkinkan karena adanya mekanisme ikatan dinamis, ikatan ini adalah ikatan yang terjadi ketika program dijalankan (run-time), ikatan yang terjadi pada saat compiling disebut ikatan dinamis. Ikatan dinamis hanya akan terjadi antara suatu objek dinamis dengan metode yang dinamis juga, dalam hal ini metode virtual (maya)
#include
#include
class Tbujursangkar
{
protected:
double panjang;
Membuat class dengan nama class Tbujursangkar dengan variable panjang dengan tipe data double dengan sifat protected, class ini akan menjadi class dasar.
public:
Tbujursangkar(double pj){panjang=pj;}
Konstruktor dengan sifat public Tbujursangkar(double pj){panjang=pj;} yang mendefinisikan variable pj sama dengan panjang,
double Panjang(){return panjang;}
fungsi Panjang dengan return value double yang mengembalikan nilai kembali ke variable panjang
virtual double Lebar(){return panjang;}
Lalu fungsi Lebar dengan penambahan syntax virtual di depan nama fungsi menandakan fungsi tersebut bersifat polimorfisme, syntax virtual akan menciptakan ikatan dinamis, ikatan ini adalah ikatan yang terjadi ketika program dijalankan (ru-time), Ikatan dinamis ini hanya akan terjadi antara suatu objek dinamis dengan metode yang dinamis juga, dalam hal ini metode virtual (maya)
double Luas(){return Panjang() *Lebar() ;}};
fungsi double Luas dengan parameter mengalikan antara fungsi Panjang dengan fungsi Lebar, yang akan menghasilkan Luas persegi panjang.
class Tpersegipanjang:public Tbujursangkar
{
Deklarasi Class diatas merupakan class Tpersegipanjang yang merupakan turunan dari class Tbujursangkar,
protected:
double lebar;
deklarasi variable lebar, variable lebar merupakan variable tambahan yang diperlukan untuk menghitung suatu persegi panjang, karena variable panjang telah ada dalam class induknya sehingga tidak perlu ditampilkan lagi.
public:
Tpersegipanjang(double pj, double lb):Tbujursangkar(pj){lebar=lb;}
Pada bagian public terdapat konstruktor Tpersegipanjang, yang mendeklarasikan variable pj dan lb dimana pj sama dengan panjang dan lb sama dengan lebar.
virtual double Lebar(){return lebar;}
deklarasi virtual fungsi Lebar yang menandakan bersifat polimorfisme ini diketahui dengan penambahan kode virtual didepan nama fungsi.
void main()//program utama
{
Tpersegipanjang *pp=new Tpersegipanjang(8,6);
Memanggil konstruktor Tpersegipanjang dalam variable pointer pp, variable pp ini di inisialiasi dengan nilai dari dari Tpersegipanjang yaitu 8 dan 6.
cout<<"panjang = "<Panjang()<<endl
<<"lebar = "<Lebar()<<endl
<<"luas = "<Luas()<<endl;
Menampilkan nilai dari panjang() dengan fungsi yang dipanggil pada kelas Tbujursangkar, lebar() dipanggil dengan fungsi dari kelas Tpersegipanajng yang bersifat polymorfisme sehingga akan terbentuk ikatan dinamis antara variable panjang dengan fungsi lebar() dan luas() dengan fungsi yang dipanggil dari kelas Tbujursangkar.
delete pp;
getch();
}
menghapus nilai dari variable pp agar tidak membebani memori. Dari dua kelas diatas, pada kelas TBujursangkar pada saat pendefinisian fungsi lebar, return ditujukan ke variabel panjang, sedangkan pada kelas Tpersegipanjang juga didefinisikan fungsi lebar yang return valuenya dikembalikan ke variabel lebar. Sehingga dari kejadian inilah terjadi apa yang dinamakan polimorfisme, yaitu pendefinisian dua fungsi dengan nama yang sama pada kelas yang berbeda dan dengan parameter yang berbeda. Polimorfisme tidak sama dengan overloading. Untuk menghindari polimorfisme yaitu dengan cara menambahkan keyword virtual didepan fungsi tersebut seperti yang terlihat pada contoh program diatas. Sehingga ketika program tersebut jika dijalankan hasil dari fungsi luas() adalah 48.
untuk penambahan fungsi keliling pada program, penambahanya adalah sebagai berikut :
virtual double keliling(){return 2*(panjang+lebar);}
atau dapat juga menambahkanya pada class Tbujursangkar, hasilnya akan sama saja. Isi dari fungsi diatas adalah rumus dari keliling persegipanjang. Dan untuk menampilkan output adalah sebagai berikut
<<"Keliling= "<keliling()<<endl;//pada program utama
Merupakan pemanggilan dari fungsi keliling pada program utama sama dengan pemanggilan pada fungsi lebar sebelumnya.
kode langkap :
#include
#include
/* class DENGAN virtual( POLYMORPHISME)==========*/
class tbujursangkar_vir
{
protected :
double panjang; //panjang sisi bujur sangkar
public:
tbujursangkar_vir(double pj) {panjang = pj;}
double panjangf() {return panjang;}
virtual double lebarf() {return panjang;}
double luasf() {return panjangf()*lebarf();}
double keliling() {return 4*panjang;}
};
class tpersegipanjang_vir:public tbujursangkar_vir
{
protected:
double lebar; //lebar persegi panjang
public:
tpersegipanjang_vir(double pj, double lb):
tbujursangkar_vir(pj) {lebar = lb;}
virtual double lebarf() {return lebar;}
double keliling() {return 2*panjang+2*lebar;}
};
//=========================================main===============================//
void main()
{
double a,b;
cout<>a ;
cout<>b ;
tbujursangkar_vir *bujur = new tbujursangkar_vir(a);
tpersegipanjang_vir *persegi = new tpersegipanjang_vir(a,b);
cout<<"===========hasil pada class tbujursangkar================"<<endl;
cout<<"panjang = "<panjangf()<<endl;
cout<<"lebar = "<lebarf()<<endl;
cout<<"luas = "<luasf()<<endl;
cout<<"keliling = "<keliling()<<endl;cout<<endl;
cout<<"===========hasil pada class tpersegipanjang================"<<endl;
cout<<"panjang = "<panjangf()<<endl;
cout<<"lebar = "<lebarf()<<endl;
cout<<"luas = "<luasf()<<endl;
cout<<"keliling = "<keliling()<<endl;
delete bujur;
delete persegi;
system("pause");
}








0 komentar:
Posting Komentar