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 sendiriKonstruktor 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 BMultiple 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.
Tantangan
MudahMari 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 classWiFiDeviceyang mewakili perangkat apa pun yang dapat terhubung ke jaringan:- Member
std::string networkNameyang 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
- Member
VoiceControl.h: Definisikan classVoiceControlyang mewakili perangkat apa pun dengan kemampuan suara:- Member
std::string assistantNameyang dilindungi - Konstruktor yang menerima nama asisten dan menyimpannya
- Method publik
listen()yang mencetak:<assistantName> is listening... - Method publik
status()yang mencetak:Voice Status: Active
- Member
main.cpp: Baca tiga input, masing-masing pada baris terpisah:- Nama perangkat (string)
- Nama jaringan WiFi (string)
- Nama asisten suara (string)
Definisikan class
SmartSpeakeryang mewarisi secara publik dariWiFiDevicedanVoiceControl:- Member privat
std::string deviceName - Konstruktor yang menerima ketiga parameter, meneruskan nama jaringan ke
WiFiDevicedan nama asisten keVoiceControlmenggunakan daftar inisialisasi, lalu menyimpan nama perangkat - Method
powerOn()yang mencetak:<deviceName> powering on..., lalu memanggilconnect()danlisten() - Method
showAllStatus()yang mencetak nama perangkat, lalu menggunakan operator resolusi lingkup untuk memanggil kedua methodstatus()agar ambiguitas teratasi
Buat object
SmartSpeakerdengan nilai input. PanggilpowerOn(), cetak satu baris kosong, lalu panggilshowAllStatus().
Contohnya, dengan input Echo, HomeNetwork, dan Alexa:
Echo powering on...
Connecting to WiFi: HomeNetwork
Alexa is listening...
Echo Status:
WiFi Status: Connected
Voice Status: ActiveMethod 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;
}
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