Tingkat Akses pada Pewarisan
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 49 dari 104.
Jenis pewarisan yang kamu pilih memengaruhi cara anggota class dasar diakses di class turunan. C++ menyediakan tiga opsi: public, protected, dan pewarisan private.
Berikut cara setiap tipe mengubah akses anggota:
| Anggota dasar | pewarisan public | pewarisan protected | pewarisan private |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | tidak dapat diakses | tidak dapat diakses | tidak dapat diakses |
class Base {
public:
int pub;
protected:
int prot;
private:
int priv;
};
class PublicDerived : public Base {
// pub bersifat public, prot bersifat protected, priv tidak dapat diakses
};
class ProtectedDerived : protected Base {
// pub bersifat protected, prot bersifat protected, priv tidak dapat diakses
};
class PrivateDerived : private Base {
// pub bersifat private, prot bersifat private, priv tidak dapat diakses
};Pewarisan public memodelkan hubungan "is-a" dan sejauh ini merupakan jenis yang paling umum. Dog adalah Animal, jadi kode eksternal dapat memperlakukannya sebagai Animal.
Inheritance protected dan private memodelkan hubungan "diimplementasikan-dengan-menggunakan". Keduanya menyembunyikan antarmuka base class dari kode luar, sehingga berguna saat kamu ingin menggunakan kembali implementasi tanpa mengekspos hubungan inheritance. Dengan inheritance private, class turunan lebih lanjut bahkan kehilangan akses ke member base class yang asli.
Tantangan
MudahMari kita pelajari bagaimana berbagai jenis pewarisan memengaruhi aksesibilitas member dengan membuat hierarki perangkat sederhana. Kamu akan membuat class dasar Device dan tiga class turunan, masing-masing menggunakan jenis pewarisan yang berbeda, untuk melihat langsung bagaimana pewarisan public, protected, dan private mengubah akses ke member.
Kamu akan menyusun kodemu dalam dua file:
Device.h: Definisikan class dasarDevicedengan tiga member pada tingkat akses yang berbeda:std::string modelyang publicint serialNumberyang protectedint internalCodeyang private (secara default diatur ke 999)- method public
showModel()yang mencetak:Model: <model>
Lalu buat tiga class turunan yang masing-masing mewarisi
Devicemenggunakan jenis pewarisan yang berbeda:PublicDevicemenggunakan pewarisan public: tambahkan methoddisplaySerial()yang mencetak:Serial: <serialNumber>ProtectedDevicemenggunakan pewarisan protected: tambahkan methoddisplaySerial()yang mencetak:Serial: <serialNumber>PrivateDevicemenggunakan pewarisan private: tambahkan methoddisplaySerial()yang mencetak:Serial: <serialNumber>
Setiap class turunan harus memiliki constructor yang menerima nama model dan nomor seri, meneruskan model ke class dasar, serta menetapkan nomor seri.
main.cpp: Baca dua input (masing-masing pada baris terpisah):- Nama model (string)
- Nomor seri (integer)
Buat satu object dari setiap jenis turunan dengan nilai input yang sama. Lalu tunjukkan perbedaan aksesnya:
Untuk
PublicDevice:- Panggil
showModel()langsung pada object (berfungsi karena pewarisan public mempertahankan akses public) - Akses
modelsecara langsung dan cetak:Direct model access: <model> - Panggil
displaySerial()
Untuk
ProtectedDevicedanPrivateDevice:- Hanya panggil
displaySerial()(showModel()danmodelyang diwarisi tidak lagi dapat diakses secara public dari luar)
Format output:
--- PublicDevice --- Model: <model> Direct model access: <model> Serial: <serial> --- ProtectedDevice --- Serial: <serial> --- PrivateDevice --- Serial: <serial>
Sebagai contoh, dengan input Laptop dan 12345:
--- PublicDevice ---
Model: Laptop
Direct model access: Laptop
Serial: 12345
--- ProtectedDevice ---
Serial: 12345
--- PrivateDevice ---
Serial: 12345Perhatikan bahwa hanya PublicDevice yang mengizinkan akses eksternal ke member public yang diwarisi. Jenis pewarisan lainnya menyembunyikan antarmuka class dasar dari kode luar, tetapi class turunan tetap dapat mengakses member protected secara internal melalui method-nya sendiri.
Coba sendiri
#include <iostream>
#include <string>
#include "Device.h"
using namespace std;
int main() {
// Baca input
string modelName;
int serialNum;
getline(cin, modelName);
cin >> serialNum;
// TODO: Buat object dari setiap tipe turunan menggunakan nilai input
// PublicDevice pubDev(modelName, serialNum);
// ProtectedDevice protDev(modelName, serialNum);
// PrivateDevice privDev(modelName, serialNum);
// TODO: Tunjukkan cara mengakses PublicDevice
cout << "--- PublicDevice ---" << endl;
// - Panggil showModel() langsung pada object
// - Akses model secara langsung dan cetak: Direct model access: <model>
// - Panggil displaySerial()
// TODO: Tunjukkan cara mengakses ProtectedDevice
cout << "--- ProtectedDevice ---" << endl;
// - Hanya panggil displaySerial() (showModel dan model tidak dapat diakses secara publik)
// TODO: Tunjukkan cara mengakses PrivateDevice
cout << "--- PrivateDevice ---" << endl;
// - Hanya panggil displaySerial() (showModel dan model tidak dapat diakses secara publik)
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online