Menu
CoddyTech

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 dasarpewarisan publicpewarisan protectedpewarisan private
publicpublicprotectedprivate
protectedprotectedprotectedprivate
privatetidak dapat diaksestidak dapat diaksestidak 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.

challenge icon

Tantangan

Mudah

Mari 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 dasar Device dengan tiga member pada tingkat akses yang berbeda:
    • std::string model yang public
    • int serialNumber yang protected
    • int internalCode yang private (secara default diatur ke 999)
    • method public showModel() yang mencetak: Model: <model>

    Lalu buat tiga class turunan yang masing-masing mewarisi Device menggunakan jenis pewarisan yang berbeda:

    • PublicDevice menggunakan pewarisan public: tambahkan method displaySerial() yang mencetak: Serial: <serialNumber>
    • ProtectedDevice menggunakan pewarisan protected: tambahkan method displaySerial() yang mencetak: Serial: <serialNumber>
    • PrivateDevice menggunakan pewarisan private: tambahkan method displaySerial() 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):
    1. Nama model (string)
    2. 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 model secara langsung dan cetak: Direct model access: <model>
    • Panggil displaySerial()

    Untuk ProtectedDevice dan PrivateDevice:

    • Hanya panggil displaySerial() (showModel() dan model yang 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: 12345

Perhatikan 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online