C++ - Inheritance (Dasar Pewarisan)
By
Rachmat Santoso
—
Minggu, 23 April 2017
—
Cplusplus
Seperti
bahasa pemrograman yang menggunakan konsep OOP lainnya, C++ juga dapat
melakukan inheritance atau pewarisan.
Inherintance atau pewarisan memungkinkan variabel atau fungsi anggota dari
suatu kelas diwariskan kelas lain. Kelas
yang mewariskan disebut kelas dasar,
sedangkan kelas yang diwarisi disebut kelas
turunan.
Salah
satu keuntungan penggunaan konsep inheritance adalah membuat suatu blok kode menjadi reuseable. Hal ini memungkinkan blok kode yang pernah dibuat dapat
digunakan kembali. Perhatikan gambar di bawah ini!
Penjelasan
- Kelas
Hewan sebagai kelas dasar mewariskan anggotanya (indera, alat gerak, dll)
kepada Kelas Burung dan Kelas Gajah yang selanjutnya disebut sebagai kelas
turunan.
- anggota khusus : merupakan anggota yang hanya dimiliki
oleh kelas tersebut sehingga membedakan dengan kelas lain. Misalkan anggota
khusus dari Kelas Burung adalah sayap, terbang, sedangkan anggota khusus dari Kelas Gajah adalah belalai, gading.
Bentuk
penulisan pewarisan:
class
<nama_kelas_turunan> : <penentu_pewarisan> <nama_kelas_dasar>
*penentu_pewarisan dapat berupa private,
protected, atau public. Baca Public, Protected, Private pada OOP.
Contoh
:
class
Gajah : public Hewan
Penentu
pewarisan
|
Hak
akses sebelumnya di kelas dasar
|
Hak
akses baru di kelas turunan
|
private
|
private
protected
public
|
tidak
diwariskan
private
private
|
protected
|
private
protected
public
|
tidak
diwariskan
protected (tetap)
protected
|
public
|
private
protected
public
|
tidak
diwariskan
protected (tetap)
public (tetap)
|
Tabel Penentu Pewarisan
Pada
pewarisan anggota kelas yang didefinisikan secara private tidak diwariskan, selain itu konstruktor dan destruktor
juga tidak diwariskan. Untuk lebih jelasnya perhatikan gambar di bawah ini!
C++ Inheritance (Dasar Pewarisan) - private, protected, dan public |
Berikut adalah contoh program sederhana yang
menerapkan inheritance pada C++:
/*
C++ -
Inheritance (Dasar Pewarisan)
Microsoft
Visual Studio Express 2012
[RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;
//Kelas Dasar "Hewan"
class Hewan
{
private:
char nama[15];
char habitat[15];
public:
void infoHewan()
{
cout<<endl;
cout<<"Info salah satu jenis hewan"<<endl;
}
};
class Gajah : public Hewan
{
private:
char ciri_khusus[20];
public:
//konstruktor
Gajah(char *nm, char *hbt, char *cr_k)
{
strcpy(nama,
nm);
strcpy(habitat,
hbt);
strcpy(ciri_khusus,
cr_k);
}
void infoGajah()
{
cout<<"Nama :
"<<nama<<endl;
cout<<"Habitat :
"<<habitat<<endl;
cout<<"Ciri Khusus : "<<ciri_khusus<<endl;
}
};
int main()
{
//menciptakan objek "gjh" sekaligus melakukan
inisialisasi melalui Konstruktor dari Kelas Gajah
Gajah gjh("Gajah", "Padang rumput", "Belalai dan
Gading");
cout<<"INHERITANCE PADA C++"<<endl;
cout<<"--------------------"<<endl;
gjh.infoHewan();
gjh.infoGajah();
_getche();
return 0;
}
Coba compile kode di atas maka akan muncul
kesalahan yang lebih kurang menyatakan bahwa variabel nama dan habitat tidak dapat
diakses atau tidak dikenali pada kelas Gajah. Mengapa demikian? Hal tersebut
terjadi karena varibel nama dan habitat pada kelas Hewan bersifat private. Ingat lagi bahwa anggota kelas private tidak pernah
diwariskan.
Untuk
mengatasi kesalahan pada program di atas, ganti keyword private pada kelas Hewan menjadi protected seperti di bawah ini.
protected:
char nama[15];
char habitat[15];
Sekarang variabel nama dan habitat juga diwariskan ke kelas Gajah sehingga dapat digunakan. Selanjutnya compile program, hasilnya seperti yang ditunjukkan oleh output program di bawah ini.
Output
INHERITANCE PADA C++
--------------------
Info salah satu jenis hewan
Nama : Gajah
Habitat : Padang rumput
Ciri Khusus : Belalai dan Gading
Penjelasan
Seperti
terlihat pada program di atas, varibel nama, habitat, dan fungsi infoHewan tidak pernah
dibuat pada kelas Gajah namun dapat dikenali oleh kelas Gajah, inilah konsep
dari inheritance (Pewarisan).
Seperti
yang pernah saya singgung sebelumnya, inilah keuntungan dari inheritance (reuseable).
Misalnya kita ingin membuat kelas Burung, burung adalah hewan dan setiap hewan
pasti memiliki nama/sebutan dan juga habitat, sehingga kita tidak perlu membuat
blok kode lagi, tinggal mewariskan dari kelas Hewan saja. Hal ini secara
otomatis juga memunculkan keuntungan lain yaitu dalam hal keefektifan dan
keefesienan dalam membuat program.
CARA LAIN
Pada
suatu kondisi mungkin kita menginginkan variabel nama dan habitat tetap
bersifat private agar hanya dapat
diakses melalui kelas yang mendeklarasikan saja, dan tidak mengizinkan untuk diakses oleh
kelas lain walaupun yang merupakan sub class-nya (kelas turunan). Maka dengan
sedikit modifikasi hal tersebut menjadi memungkinkan untuk dilakukan.
Berikut adalah program yang telah
dimodifikasi:
/*
C++ - Inheritance (Dasar
Pewarisan)
Microsoft Visual Studio
Express 2012
[RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;
//Kelas Dasar "Hewan"
class Hewan
{
private:
char nama[15];
char habitat[15];
public:
//konsruktor
//di sini letak modifikasinya
Hewan(char *nm, char *hbt)
{
cout<<"//konstruktor kelas Hewan dijalankan"<<endl;
strcpy(nama, nm);
strcpy(habitat, hbt);
}
~Hewan()
{
cout<<"//destruktor kelas Hewan dijalankan"<<endl;
_getche();
}
//di sini letak modifikasinya
void infoHewan()
{
cout<<endl;
cout<<"Info salah satu jenis hewan"<<endl;
cout<<"Nama :
"<<nama<<endl;
cout<<"Habitat :
"<<habitat<<endl;
}
};
class Gajah : public Hewan
{
private:
char ciri_khusus[20];
public:
//konstruktor
//di sini letak modifikasinya
Gajah(char *nm, char *hbt, char *cr_k) : Hewan(nm, hbt)
{
cout<<"//konstruktor kelas Gajah dijalankan"<<endl;
strcpy(ciri_khusus, cr_k);
}
~Gajah()
{
cout<<"//destruktor kelas Gajah dijalankan"<<endl;
}
//di sini letak modifikasinya
void infoGajah()
{
cout<<"Ciri Khusus : "<<ciri_khusus<<endl;
}
};
int main()
{
//menciptakan objek "gjh" sekaligus melakukan
inisialisasi melalui Konstruktor dari Kelas Gajah dan Konstruktor dari Kelas
Hewan
Gajah gjh("Gajah", "Padang rumput", "Belalai dan
Gading");
cout<<"\n//awal fungsi main()\n"<<endl;
cout<<"INHERITANCE PADA C++"<<endl;
cout<<"--------------------"<<endl;
gjh.infoHewan();
gjh.infoGajah();
cout<<"\n//akhir fungsi main()\n"<<endl;
return 0;
}
Output
//konstruktor kelas Hewan dijalankan
//konstruktor kelas Gajah dijalankan
//awal fungsi main()
INHERITANCE PADA C++
--------------------
Info salah satu jenis hewan
Nama : Gajah
Habitat : Padang rumput
Ciri Khusus : Belalai dan Gading
//akhir fungsi main()
//destruktor kelas Gajah dijalankan
//destruktor kelas Hewan dijalankan
Penjelasan
Perhatikan potongan program di bawah ini dan
output program,
Gajah gjh("Gajah", "Padang rumput", "Belalai dan Gading");
Ketika objek gjh diciptakan secara otomatis
konstruktor akan dijalankan. Lalu bagaimana urutannya? Seperti yang terlihat
pada ouput program kontruktor dari kelas dasar (Hewan) dijalankan terlebih
dahulu, kemudian baru konstruktor dari kelas turunan (Gajah) dijalankan.
Destruktor kelas turunan (Gajah) dijalankan terlebih dahulu, kemudian baru
destruktor kelas dasar (Hewan) dijalankan.
Perhatikan konstruktor Gajah(char *nm, char *hbt, char *cr_k) : Hewan(nm, hbt). Pernyataan : Hewan(nm, hbt) digunakan untuk
melakukan inisialisasi terhadap variabel nama
dan habitat pada kelas Hewan. Penginisialisasian terjadi ketika objek gjh diciptakan tepatnya ketika konstruktor pada kelas Hewan dijalankan. Penginisialisasian dilakukan dengan memanfaatkan nilai yang ditangkap oleh variabel pada parameter fungsi, yaitu nm dalam hal ini “Gajah”
dan variabel hbt dalam hal ini “Padang rumput”.
Baca juga untuk memudahkan pemahaman:
1. Mengenal OOP pada C++
2. Public, Protected, Private pada OOP
3. Konstruktor dan Destruktor pada OOP C++
4. C++ - Inheritance (Pewarisan Bertingkat dan Pewarisan Ganda)
1. Mengenal OOP pada C++
2. Public, Protected, Private pada OOP
3. Konstruktor dan Destruktor pada OOP C++
4. C++ - Inheritance (Pewarisan Bertingkat dan Pewarisan Ganda)
[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