BAB IV Pemrograman Berorientasi Objek
4.3 Pewarisan Sifat Objek
class PROGRAMMER: public KARYAWAN { public:
void Bekerja() {
cout<<”Bekerja dengan membuat program di komputer”; cout<<end1;
} };
class GURU: public KARYAWAN { public:
void Bekerja() {
cout<<”Bekerja mengajar di depan kelas”; cout<<end1
} };
// Fungsi utama int main() {
// Melakukan instansiasi terhadap kelas KARYAWAN KARYAWAN A; // salah, tidak diizinkan oleh karyawan // Melakukan instansiasi terhadap kelas PROGRAMMER
PROGRAMMER B;
// Melakukan instansiasi terhadap kelas GURU
GURU C;
return 0 }
4.3 Pewarisan Sifat Objek
Salah satu ciri dari OOP, seperti yang telah disebut sebelumnya, adalah kemampuan suatu objek atau kelas untuk mewariskan sifat-sifat yang terdapat di dalamnya ke kelas turunannya. Hal ini dinamakan dengan
inheritance.
Kelas Dasar dan Kelas Turunan
Kelas dasar yang dimaksud di sini adalah sebuah kelas yang akan dijadikan sebagai induk dari kelas lain. Kelas dasar ini masih lebih dikenal dengan
istilah dalam bahasa asing yaitu base class. Sedangkan kelas baru yang merupakan hasil dari proses penurunan tersebut disebut dengan kelas turunan, atau sering juga diebut dengan derived class.
Dalam program, kelas dapat dijadikan sebagai kelas dasar (induk) untuk meudian diturunkan menjadi kelas-kelas selanjutnya. Misalnya terdapat kelas A yang diturunkan menjadi kelas B, selanjutnya kelas B diturunkan menjadi kelas C, begitu seterusnya. Disini, kelas B dan kelas C tentu akan memiliki sifat-sifat yang terdapat pada kelas A. Begitu juga kelas C, pasti akan mewarisi sifat-sifat yang terdapat pada kelas B.
Sintaks yang umum dipakai untuk membuat suatu kelas turunan adalah sebagai berikut:
Berikut ini adalah contoh program yang melakukan proses penurunan, dimana penurunan dilakukan dua kali seperti penjelasan di atas. Pada program ini kita akan melihat pewarisan dari sifat yang dimiliki kelas induk oleh kelas turunan.
#include<iostream.h>
//membuat kelas dasar dengan nama Induk class Induk{ int x; public: void SetX(int xx){ x = xx; } int GetX(){ return x; } };
//membuat kelas turunan dari kelas Induk dengan nama Turunan1 class Turunan1; public Induk{
int y; public:
void SetY(int yy){ y = yy;
}
int GetY(){
class nama_kelas_turunan: hak_akses nama_kelas_dasar{ //data-data dan fungsi-fungsi
… }
return y; }
};
//membuat kelas turunan dari kelas Induk dengan nama Turunan2 class Turunan2; public Turunan1{
int z; public: void SetZ(int zz){ z = zz; } int GetZ(){ return z; } }; //fungsi utama int main(){
//melakukan instansiasi terhadap kelas Turunan2 Turunan2 A;
//melakukan pengesetan nilai x,y,z melalui kelas Turunan2 A.SetX(20);
A.SetY(30); A.SetZ(40);
<<A.GetX();
cout<<”Nilai y yang dipanggil dari kelas Turunan2:” <<A.GetY(); cout<<”Nilai z yang dipanggil dari kelas Turunan2:” <<A.GetZ();
return 0; }
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Hasil di atas menunjukkan bahwa kelas Turunan2 akan memiliki fungsi-fungsi yang dimiliki oleh kelas induknya (kelas Turunan1), yaitu fungsi SetY dan GetY. Namun perlu diperhatikan, di sini kelas Turunan1 adalah turunan dari kelas Induk, maka dari itu secara otomatis kelas Turunan2 juga akan memiliki fungsi-fungsi yang dimiliki oleh kelas Induk, yaitu fungsi SetX dan GetX. Walaupun demikian, sebuah kelas turunan tetap tidak dapat mewarisi data atau fungsi-fungsi yang bersifat private pada kelas induknya.
Hak Akses pada Proses Pewarisan
Dalam proses penurunan sebuah kelas, kita harus benar-benar pandai dalam memberikan hak akses data atau fungsi terhadap kelas turunan. Berikut ini
Nilai x yang dipanggil dari kelas Turunan2: 20 Nilai y yang dipanggil dari kelas Turunan2: 30 Nilai z yang dipanggil dari kelas Turunan2: 40
hal-hal yang perlu Anda ketahui dalam membuat sebuah kelas turunan. Apabila kelas diturunkan sebagai public dari kelas induknya, maka:
o Bagian public yang terdapat pada kelas induk tetap akan menjadi bagian
public pada kelas turunannya.
o Bagian protected yang terdapat pada kelas induk tetap akan menjadi bagian protected pada kelas turunannya.
o Bagian private yang terdapat pada kelas induk tetap tidak dapat diakses oleh kelas turunannya.
Apabila kelas diturunkan sebagai private dari kelas induknya, maka:
o Bagian public yang terdapat pada kelas induk tetap akan menjadi bagian
private pada kelas turunannya.
o Bagian private yang terdapat pada kelas induk tetap akan menjadi bagian
protected pada kelas turunannya.
o Bagian private yang terdapat pada kelas induk tetap tidak dapat diakses oleh kelas turunannya.
Jika kita lihat program di atas, bagian public dari kelas induk (yaitu fungsi SetX dan GetX) tetap akan menjadi bagian public pada kelas Turunan1, sedangkan variabel X yang terdapat pada bagian private tetap tidak dapat diakses oleh kelas Turunan1. Sampai disini, berarti kelas Turunan1 telah mempunyai empat buah fungsi yang bersifat public (yaitu fungsi SetY. GetY, SetX, GetX). Selanjutnya kelas Turunan1 akan diturunkan lagi secara public terhadap kelas Turunan2. Hal ini menyebabkan bagian public yang terdapat pda kelas Turunan1 akan diwariskan semuanya kepada kelas Turunan2 sehingga kelas Turunan2, akan mempunyai enam buah fungsi yang bersifat
public (yaitu fungsi SetZ, GetZ, SetY. GetY, SetX, GetX). Itulah sebabnya
pada program di atas kita dapat mengakses fungsi-fungsi yang terdapat pada kelas Induk dan kelas Turunan1 melalui suatu objek (instance) dari kelas Turunan2.
Multiple Inheritance
Salah satu kelebihan dari C++ dibandingkan bahasa-bahasa pemrograman lain yang juga mendukung OOP adalah karena C++ mendukung adanya
multiple inheritance. Adapun multiple inheritance yang dimaksud disini adalah
dua kelas induk atau lebih. Sebagai contoh, kita memiliki kelas A dan B yang masing-masing berdiri sendiri. Kemudian kita ingin membuat kelas C yang merupakan turunan dari kelas A dan B. Dengan demikian, kelas C tentu akan mewarisi sifat-sifat yang terdapat pada kelas A dan kelas B.
Sebenarnya kita bisa juga melakukannya dengan proses yang berulang, yaitu dengan menurunkan kelas A menjadi kelas B, kemudian baru menurunkan kelas B menjadi kelas C. Namun hal ini tentu akan memakan waktu yang cukup lama dibandingkan kita menurunkannya dari beberapa induk secara langsung.
Adapun bentuk umum dari pembuatan kelas melalui proses multiple
inheritance adalah sebagai berikut:
/* membuat kelas dengan nama Induk2 yang tidak berkaitan dengan kelas Induk1 */
class Induk2{ int y; public:
void SetY(int yy){ y = yy; } class nama_kelas_turunan: hak_akses nama_kelas_induk1, hak_akses nama_kelas_induk2, hak_akses nama_kelas_indukN, … {
//data-data dan fungsi-fungsi …
};
#include<iostream.h>
//membuat kelas dasar dengan nama Induk1 class Induk1{ int x; public: void SetX(int xx){ x = xx; } int GetX(){ return x; }
int GetY(){ return y; }
};
// membuat kelas Turunan dari kelas Induk1 dan Induk2 class Turunan; public Induk1, public Induk2{
int z; public: void SetZ(int zz){ z = zz; } int GetZ(){ return z; } }; //fungsi utama int main(){
//melakukan instansiasi terhadap kelas Turunan Turunan A;
//memanggil fungsi-fungsi yang terdapat pada kelas Turunan A.SetX(100);
A.SetY(200); A.SetZ(300);
//menampilkan nilai yang diset cout<<”Nilai x :” <<A.GetX(); cout<<”Nilai y :” <<A.GetY(); cout<<”Nilai z :” <<A.GetZ();
return 0; }
Apabila program dijalankan, program akan memberikan hasil seperti di bawah ini:
Seperti yang telah dijelaskan di atas bahwa kelas Turunan akan memiliki fungsi-fungsi yang terdapat di bagian public atau protected pada kelas-kelas induknya. Pada contoh ini, fungsi-fungsi yang akan dimiliki kelas Turunan adalah fungsi SetZ, GetZ, SetY, GetY, SetX, dan GetX.
Nilai x : 100 Nilai y : 200 Nilai z : 300