Menu
CoddyTech

Pewarisan Berganda

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 53 dari 104.

C++ memungkinkan sebuah class mewarisi beberapa class dasar secara bersamaan. Ini disebut multiple inheritance dan memungkinkan kamu menggabungkan fitur dari hierarki class yang berbeda.

Untuk mewarisi dari beberapa class, pisahkan dengan koma:

class Printer {
public:
    void print() {
        std::cout << "Printing document" << std::endl;
    }
};

class Scanner {
public:
    void scan() {
        std::cout << "Scanning document" << std::endl;
    }
};

class MultiFunctionDevice : public Printer, public Scanner {
public:
    void copy() {
        scan();
        print();
    }
};

class MultiFunctionDevice kini memiliki akses ke method dari Printer dan Scanner:

MultiFunctionDevice mfd;
mfd.print();  // Dari Printer
mfd.scan();   // Dari Scanner
mfd.copy();   // Method miliknya sendiri

Konstruktor dipanggil sesuai urutan class dasar yang tercantum dalam deklarasi pewarisan (dari kiri ke kanan), sedangkan destruktor dipanggil dalam urutan terbalik. Kamu dapat meneruskan argumen ke setiap konstruktor dasar dalam daftar inisialisasi:

class MultiFunctionDevice : public Printer, public Scanner {
public:
    MultiFunctionDevice() : Printer(), Scanner() {}
};

Masalah potensial muncul ketika kedua base class memiliki member dengan nama yang sama. Ini menimbulkan ambiguitas, dan kamu harus menggunakan operator resolusi scope untuk menentukan member yang kamu maksud:

class A { public: void show() {} };
class B { public: void show() {} };
class C : public A, public B {};

C obj;
obj.A::show();  // Panggil versi A
obj.B::show();  // Panggil versi B

Multiple inheritance sangat berguna, tetapi dapat menimbulkan situasi yang rumit, terutama ketika base class memiliki ancestor yang sama. Kita akan membahas tantangan itu di pelajaran berikutnya.

challenge icon

Tantangan

Mudah

Mari bangun sistem perangkat rumah pintar yang menggabungkan kemampuan dari beberapa class dasar menggunakan pewarisan berganda. Kamu akan membuat perangkat yang dapat terhubung ke WiFi dan dikendalikan dengan suara, lalu menggabungkan fitur-fitur ini menjadi satu speaker pintar.

Kamu akan mengatur kodemu dalam tiga file:

  • WiFiDevice.h: Definisikan class WiFiDevice yang mewakili perangkat apa pun yang dapat terhubung ke jaringan:
    • Member std::string networkName yang dilindungi
    • Konstruktor yang menerima nama jaringan dan menyimpannya
    • Method publik connect() yang mencetak: Connecting to WiFi: <networkName>
    • Method publik status() yang mencetak: WiFi Status: Connected
  • VoiceControl.h: Definisikan class VoiceControl yang mewakili perangkat apa pun dengan kemampuan suara:
    • Member std::string assistantName yang dilindungi
    • Konstruktor yang menerima nama asisten dan menyimpannya
    • Method publik listen() yang mencetak: <assistantName> is listening...
    • Method publik status() yang mencetak: Voice Status: Active
  • main.cpp: Baca tiga input, masing-masing pada baris terpisah:
    1. Nama perangkat (string)
    2. Nama jaringan WiFi (string)
    3. Nama asisten suara (string)

    Definisikan class SmartSpeaker yang mewarisi secara publik dari WiFiDevice dan VoiceControl:

    • Member privat std::string deviceName
    • Konstruktor yang menerima ketiga parameter, meneruskan nama jaringan ke WiFiDevice dan nama asisten ke VoiceControl menggunakan daftar inisialisasi, lalu menyimpan nama perangkat
    • Method powerOn() yang mencetak: <deviceName> powering on..., lalu memanggil connect() dan listen()
    • Method showAllStatus() yang mencetak nama perangkat, lalu menggunakan operator resolusi lingkup untuk memanggil kedua method status() agar ambiguitas teratasi

    Buat object SmartSpeaker dengan nilai input. Panggil powerOn(), cetak satu baris kosong, lalu panggil showAllStatus().

Contohnya, dengan input Echo, HomeNetwork, dan Alexa:

Echo powering on...
Connecting to WiFi: HomeNetwork
Alexa is listening...

Echo Status:
WiFi Status: Connected
Voice Status: Active

Method showAllStatus() harus mencetak nama perangkat yang diikuti oleh " Status:" pada satu baris, lalu memanggil method status() dari setiap class dasar menggunakan WiFiDevice::status() dan VoiceControl::status() untuk menghindari ambiguitas karena kedua class dasar memiliki method dengan nama yang sama.

Coba sendiri

#include <iostream>
#include <string>
#include "WiFiDevice.h"
#include "VoiceControl.h"

using namespace std;

// TODO: Definisikan class SmartSpeaker yang mewarisi secara publik dari WiFiDevice dan VoiceControl
// - Anggota privat: deviceName (string)
// - Konstruktor: menerima deviceName, networkName, assistantName
//   Gunakan daftar inisialisasi untuk meneruskan networkName ke WiFiDevice dan assistantName ke VoiceControl
// - Method powerOn(): mencetak "<deviceName> powering on...", lalu memanggil connect() dan listen()
// - Method showAllStatus(): mencetak "<deviceName> Status:", lalu memanggil kedua method status()
//   menggunakan resolusi cakupan (WiFiDevice::status() dan VoiceControl::status())

class SmartSpeaker {
    // TODO: Implementasikan class SmartSpeaker di sini
};

int main() {
    string deviceName, networkName, assistantName;
    getline(cin, deviceName);
    getline(cin, networkName);
    getline(cin, assistantName);

    // TODO: Buat object SmartSpeaker dengan nilai input
    // TODO: Panggil powerOn()
    // TODO: Cetak baris kosong
    // TODO: Panggil showAllStatus()

    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