Ads (728x90)

Latest Post

Kesehatan

Tips


Pada C++ untuk dapat menerapkan polimorfisme, maka kita perlu menggunakan fungsi khusus yang dikenal sebagai fungsi virtual. Fungsi ini kita letakkan pada superclass, kemudian fungsi tersebut dapat kita definisikan ulang pada subclass. Perhatikan contoh berikut.

Contoh 9.29. Penggunaan fungsi virtual.

#include <iostream>

using namespace std;

class AnggotaSekolah {
char* nama;
char* alamat;
public:
void SetNama(char* N) {
nama = N;
}
void SetAlamat(char* A) {
alamat = A;
}
char* GetNama() {
return nama;
}
char* GetAlamat() {
return alamat;
}
// Membuat fungsi virtual
virtual void Bekerja() {
cout<<"Bekerja"<<endl;
}
virtual void Berpakaian() {
cout<<"Berpakaian"<<endl;
}
};

class Siswa: public AnggotaSekolah {
char* Jurusan;
char* Program;
int semester;
public:
void SetJurusan(char* J) {
Jurusan = J;
}
void SetProgram(char* P) {
Program = P;
}
void SetSemester(int smt) {
semester = smt;
}
char* GetJurusan() {
return Jurusan;
}
char* GetProgram() {
return Program;
}
int GetSemester() {
return semester;
}
// override pada fungsi Bekerja
void Bekerja() {
cout<<"Bekerja menuntut ilmu"<<endl;
}
// override pada fungsi Berpakaian
void Berpakaian() {
cout<<"Berpakaian seragam putih abu-abu"<<endl;
}
};

class Guru: public AnggotaSekolah {
char* jabatan;
char* keahlian;
public:
void SetJabatan(char* jbt) {
jabatan = jbt;
}
void SetKeahlian(char* khl) {
keahlian = khl;
}
char* GetJabatan() {
return jabatan;
}
char* GetKeahlian() {
return keahlian;
}
// override pada fungsi Bekerja
void Bekerja() {
cout<<"Bekerja mengajarkan ilmu"<<endl;
}
// override pada fungsi Berpakaian
void Berpakaian() {
cout<<"Berpakaian baju seragam dinas resmi"<<endl;
}
};

// Fungsi utama int main() {

// instansiasi pada kelas AnggotaSekolah, Siswa dan Guru
AnggotaSekolah As;
Siswa Sw;
Guru Gr;

// Memanggil fungsi Bekerja dari masing-masing kelas
cout<<"Anggota sekolah sedang ";
As.Bekerja();
cout<<"Siswa sedang ";
Sw.Bekerja();
cout<<"Guru sedang ";
Gr.Bekerja();
cout<<'\n';

// Memanggil fungsi Berpakaian dari masing-masing kelas
cout<<"Anggota sekolah harus ";
As.Berpakaian();
cout<<"Siswa harus ";
Sw.Berpakaian();
cout<<"Guru harus ";
Gr.Berpakaian();
return 0;
}

Pada kode program di atas, ada dua fungsi/method virtual yaitu: Bekerja dan Berpakaian. Method ini adalah yang akan kita gunakan pada subclass, namun dengan penerapan yang lain. Perhatikan isi dari masing-masing method tersebut pada masing-masing subclass. Cara ini biasa disebut sebagai overriding. Coba kembali ke 'pemrograman berorientasi obyek dengan java' untuk memperjelas pengertian overriding. Bandingkan juga, bagaimana overriding dilakukan pada Java dan C++. Jika program di atas dijalankan, maka hasilnya akan tampak seperti pada gambar 9.9. Overloading juga dapat dilakukan pada fungsi virtual. Kita tentu masih ingat perbedaan overriding dan overloading yang sudah dijelaskan di 'pemrograman berorientasi obyek dengan java'.


Pada contoh 9.29 di atas, fungsi virtual dibuat lengkap dengan isi dari fungsi tersebut. Namun sebenarnya C++ juga menyediakan fungsi virtual murni (pure virtual function) yang hanya ada deklarasi fungsinya tapi tidak ada isinya. Konsep ini mirip dengan ketika kita memmahami tentang interface pada Java. Fungsi virtual murni ini kemudian akan diterjemahkan isinya pada kelas-kelas yang merupakan turunan dari kelas tersebut. Keuntungan dari penggunaan fungsi virtual murni ini adalah keleluasaan kita untuk mendefinisikan fungsi-fungsi tersebut pada kelas turunannya. Fungsi virtual murni biasanya digunakan pada kelas abstrak. Kelas abstrak adalah kelas yang mempunyai paling tidak satu fungsi virtual murni. Karena masih abstrak, kita tidak diperbolehkan untuk membuat obyek langsung dari kelas abstrak.

Konsep polimorfisme pada C++ disusun dengan berdasarkan pengertian pada fungsi virtual, fungsi virtual murni, overriding, overloading, dan kelas abstrak. Perhatikan contoh polimofisme berikut ini.

Contoh 9.30. Penerapan polimorfisme.

#include &lt;iostream&gt;
using namespace std;

class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
virtual int area (void) =0; //fungsi virtual murni
void printarea (void)
{ cout &lt;&lt; this-&gt;area() &lt;&lt; endl; }
};

class CRectangle: public CPolygon {
public:
// overriding fungsi area
int area (void)
{ return (width * height); }
};

class CTriangle: public CPolygon {
public:
// overriding fungsi area
int area (void)
{ return (width * height / 2); }
};

int main () {
CRectangle rect;
CTriangle trgl;
CPolygon *ppoly1 = &amp;rect; // mendefinisikan obyek pointer
CPolygon *ppoly2 = &amp;trgl; // mendefinisikan obyek pointer
ppoly1->set_values (4,5);
ppoly2->set_values (4,5);
ppoly1->printarea();
ppoly2->printarea();
return 0;
}

Pada contoh di atas, kelas CPolygon adalah kelas abstrak yang memiliki fungsi virtual murni yaitu area. Perhatikan cara mendeklarasikan fungsi virtual murni pada baris yang diawali dengan pernyataan virtual. Fungsi ini tidak dibuat isinya tapi dibuat dengan tanda = 0. Kita tidak dapat membuat obyek langsung dari kelas CPolygon ini. Tetapi kita dapat membuat obyek pointer untuk mengalokasikan memori berdasarkan kelas ini. Pada kelas CPolygon juga digunakan kata kunci this. Kata kunci ini berfungsi untuk menunjuk pada kelas itu sediri. Pernyataan this->area() pada kode di atas sama artinya dengan CPolygon->area(). Jadi pernyataan ini sama artinya dengan memanggil fungsi virtual area di dalam kelas itu.

Pada kode diatas dibuat dua variabel pointer *ppoly1 dan *ppoly2 yang nilainya sama dengan nilai dari alamat variabel rect dan trgl. Perhatikan dengan baik penggunaan tanda * dan &amp; untuk merujuk pada alamat memori. Jalankan program di atas dan perhatikan hasilnya.

Halaman Terkait:
| Kelas | Deklarasi kelas | Polimorfisme |

Post a Comment