Menguasai Warisan C++: Public, Protected & Private Dijelaskan
Warisan Public, Protected dan Private C++
Dalam tutorial ini, kita akan mempelajari cara menggunakan warisan public, protected dan private dalam C++ dengan bantuan contoh.
Dalam warisan C++, kita dapat menurunkan kelas anak dari kelas dasar dalam berbagai mode akses. Misalnya,
class Base { .... ... .... }; class Derived : public Base { .... ... .... };
Perhatikan kata kunci public dalam kode
class Derived : public Base
Ini berarti bahwa kita telah membuat kelas turunan dari kelas dasar dalam mode public. Secara alternatif, kita juga dapat menurunkan kelas dalam mode protected atau private.
Kata kunci 3 ini (public, protected, dan private) dikenal sebagai pengubah akses dalam warisan C++.
Warisan public, protected dan private dalam C++
public, protected, dan private warisan memiliki fitur berikut:
- warisan public membuat anggota
public dari kelas dasar menjadi public di kelas turunan, dan anggota protected dari kelas dasar tetap protected di kelas turunan. - warisan protected membuat anggota
public dan protected dari kelas dasar menjadi protected di kelas turunan. - warisan private membuat anggota
public dan protected dari kelas dasar menjadi private di kelas turunan.
Catatan: Anggota private dari kelas dasar tidak dapat diakses oleh kelas turunan.
class Base { public: int x; protected: int y; private: int z; }; class PublicDerived: public Base { // x adalah public // y adalah protected // z tidak dapat diakses dari PublicDerived }; class ProtectedDerived: protected Base { // x adalah protected // y adalah protected // z tidak dapat diakses dari ProtectedDerived }; class PrivateDerived: private Base { // x adalah private // y adalah private // z tidak dapat diakses dari PrivateDerived }
Contoh 1: Warisan public C++
// Program C++ untuk menunjukkan cara kerja warisan public #include <iostream> using namespace std; class Base { private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // fungsi untuk mengakses anggota private int getPVT() { return pvt; } }; class PublicDerived : public Base { public: // fungsi untuk mengakses anggota protected dari Base int getProt() { return prot; } }; int main() { PublicDerived object1; cout << "Private = " << object1.getPVT() << endl; cout << "Protected = " << object1.getProt() << endl; cout << "Public = " << object1.pub << endl; return 0; }
Output
Private = 1 Protected = 2 Public = 3
Di sini, kita telah menurunkan PublicDerived dari Base dalam mode public.
Akibatnya, di dalam PublicDerived:
- prot diwarisi sebagai protected.
- pub dan
getPVT() diwarisi sebagai public. - pvt tidak dapat diakses karena ia private di
Base.
Karena anggota private dan protected tidak dapat diakses dari main(), kita perlu membuat fungsi public getPVT() dan getProt() untuk mengaksesnya:
// Kesalahan: anggota "Base::pvt" tidak dapat diakses cout << "Private = " << object1.pvt; // Kesalahan: anggota "Base::prot" tidak dapat diakses cout << "Protected = " << object1.prot;
Perhatikan bahwa fungsi getPVT() telah didefinisikan di dalam Base. Namun, fungsi getProt() telah didefinisikan di dalam PublicDerived.
Ini karena pvt, yang private di Base, tidak dapat diakses oleh PublicDerived.
Namun, prot dapat diakses oleh PublicDerived karena warisan public. Jadi, getProt() dapat mengakses variabel protected dari dalam PublicDerived.
Keterjangkauan dalam Warisan public
| Keterjangkauan | anggota private | anggota protected | anggota public |
|---|
| Kelas Dasar | Ya | Ya | Ya |
| Kelas Turunan | Tidak | Ya | Ya |
Contoh 2: Warisan protected C++
// Program C++ untuk menunjukkan cara kerja warisan protected #include <iostream> using namespace std; class Base { private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // fungsi untuk mengakses anggota private int getPVT() { return pvt; } }; class ProtectedDerived : protected Base { public: // fungsi untuk mengakses anggota protected dari Base int getProt() { return prot; } // fungsi untuk mengakses anggota public dari Base int getPub() { return pub; } }; int main() { ProtectedDerived object1; cout << "Private tidak dapat diakses." << endl; cout << "Protected = " << object1.getProt() << endl; cout << "Public = " << object1.getPub() << endl; return 0; }
Output
Private tidak dapat diakses. Protected = 2 Public = 3
Di sini, kita telah menurunkan ProtectedDerived dari Base dalam mode protected.
Akibatnya, di dalam ProtectedDerived:
- prot, pub dan
getPVT() diwarisi sebagai protected. pvt tidak dapat diakses karena ia private di Base.
Seperti yang kita ketahui, anggota protected tidak dapat diakses secara langsung dari luar kelas. Akibatnya, kita tidak dapat menggunakan getPVT() dari ProtectedDerived.
Itulah juga sebabnya kita perlu membuat fungsi getPub() di dalam ProtectedDerived untuk mengakses variabel pub.
// Kesalahan: anggota "Base::getPVT()" tidak dapat diakses cout << "Private = " << object1.getPVT(); // Kesalahan: anggota "Base::pub" tidak dapat diakses cout << "Public = " << object1.pub;
Keterjangkauan dalam Warisan protected
| Keterjangkauan | anggota private | anggota protected | anggota public |
|---|
| Kelas Dasar | Ya | Ya | Ya |
| Kelas Turunan | Tidak | Ya | Ya (diwarisi sebagai variabel protected) |
Contoh 3: Warisan private C++
// Program C++ untuk menunjukkan cara kerja warisan private #include <iostream> using namespace std; class Base { private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // fungsi untuk mengakses anggota private int getPVT() { return pvt; } }; class PrivateDerived : private Base { public: // fungsi untuk mengakses anggota protected dari Base int getProt() { return prot; } // fungsi untuk mengakses anggota private int getPub() { return pub; } }; int main() { PrivateDerived object1; cout << "Private tidak dapat diakses." << endl; cout << "Protected = " << object1.getProt() << endl; cout << "Public = " << object1.getPub() << endl; return 0; }
Output
Private tidak dapat diakses. Protected = 2 Public = 3
Di sini, kita telah menurunkan PrivateDerived dari Base dalam mode private.
Akibatnya, di dalam PrivateDerived:
- prot,
pub dan getPVT() diwarisi sebagai private. - pvt tidak dapat diakses karena ia private di
Base.
Seperti yang kita ketahui, anggota private tidak dapat diakses secara langsung dari luar kelas. Akibatnya, kita tidak dapat menggunakan getPVT() dari PrivateDerived.
Itulah juga sebabnya kita perlu membuat fungsi getPub() di dalam PrivateDerived untuk mengakses variabel pub.
// Kesalahan: anggota "Base::getPVT()" tidak dapat diakses cout << "Private = " << object1.getPVT(); // Kesalahan: anggota "Base::pub" tidak dapat diakses cout << "Public = " << object1.pub;
Keterjangkauan dalam Warisan private
| Keterjangkauan | anggota private | anggota protected | anggota public |
|---|
| Kelas Dasar | Ya | Ya | Ya |
| Kelas Turunan | Tidak | Ya (diwarisi sebagai variabel private) | Ya (diwarisi sebagai variabel private) |