Menu
Coddy logo textTech

Mehrfachvererbung

Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 53 von 104.

C++ ermöglicht es einer Klasse, gleichzeitig von mehreren Basisklassen zu erben. Dies wird als Mehrfachvererbung bezeichnet und ermöglicht es Ihnen, Funktionen aus verschiedenen Klassenhierarchien zu kombinieren.

Um von mehreren Klassen zu erben, trennen Sie diese durch Kommas:

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();
    }
};

Die Klasse MultiFunctionDevice hat nun Zugriff auf Methoden sowohl von Printer als auch von Scanner:

MultiFunctionDevice mfd;
mfd.print();  // Von Printer
mfd.scan();   // Von Scanner
mfd.copy();   // Eigene Methode

Konstruktoren werden in der Reihenfolge aufgerufen, in der die Basisklassen in der Vererbungsdeklaration aufgeführt sind (von links nach rechts), und Destruktoren in umgekehrter Reihenfolge. Sie können jedem Basiskonstruktor in der Initialisierungsliste Argumente übergeben:

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

Ein potenzielles Problem tritt auf, wenn beide Basisklassen ein Element mit demselben Namen haben. Dies führt zu Mehrdeutigkeit, und Sie müssen den Bereichsauflösungsoperator verwenden, um anzugeben, welches Element Sie meinen:

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

C obj;
obj.A::show();  // Rufe die Version von A auf
obj.B::show();  // Rufe die Version von B auf

Mehrfachvererbung ist leistungsstark, kann aber zu komplexen Situationen führen, insbesondere wenn Basisklassen einen gemeinsamen Vorfahren haben. Wir werden diese Herausforderung in der nächsten Lektion untersuchen.

challenge icon

Aufgabe

Einfach

Lass uns ein Smart-Home-Gerätesystem erstellen, das mithilfe von Mehrfachvererbung Funktionen mehrerer Basisklassen kombiniert. Du wirst Geräte erstellen, die sich sowohl mit WiFi verbinden als auch per Sprache steuern lassen, und diese Funktionen anschließend zu einem einheitlichen intelligenten Lautsprecher kombinieren.

Du organisierst deinen Code auf drei Dateien verteilt:

  • WiFiDevice.h: Definiere eine WiFiDevice-Klasse, die jedes Gerät repräsentiert, das sich mit einem Netzwerk verbinden kann:
    • Ein geschütztes std::string networkName-Element
    • Einen Konstruktor, der einen Netzwerknamen entgegennimmt und ihn speichert
    • Eine öffentliche connect()-Methode, die Folgendes ausgibt: Connecting to WiFi: <networkName>
    • Eine öffentliche status()-Methode, die Folgendes ausgibt: WiFi Status: Connected
  • VoiceControl.h: Definiere eine VoiceControl-Klasse, die jedes Gerät mit Sprachfunktionen repräsentiert:
    • Ein geschütztes std::string assistantName-Element
    • Einen Konstruktor, der einen Namen des Sprachassistenten entgegennimmt und ihn speichert
    • Eine öffentliche listen()-Methode, die Folgendes ausgibt: <assistantName> is listening...
    • Eine öffentliche status()-Methode, die Folgendes ausgibt: Voice Status: Active
  • main.cpp: Lies drei Eingaben ein (jeweils in einer eigenen Zeile):
    1. Gerätename (String)
    2. Name des WiFi-Netzwerks (String)
    3. Name des Sprachassistenten (String)

    Definiere eine SmartSpeaker-Klasse, die öffentlich von WiFiDevice und VoiceControl erbt:

    • Ein privates std::string deviceName-Element
    • Einen Konstruktor, der alle drei Parameter entgegennimmt, den Netzwerknamen mithilfe der Initialisierungsliste an WiFiDevice und den Namen des Sprachassistenten an VoiceControl übergibt und den Gerätenamen speichert
    • Eine powerOn()-Methode, die Folgendes ausgibt: <deviceName> powering on..., und anschließend connect() und listen() aufruft
    • Eine showAllStatus()-Methode, die den Gerätenamen ausgibt und anschließend den Bereichsauflösungsoperator verwendet, um beide status()-Methoden aufzurufen und die Mehrdeutigkeit aufzulösen

    Erstelle ein SmartSpeaker-Objekt mit den Eingabewerten. Rufe powerOn() auf, gib eine leere Zeile aus und rufe anschließend showAllStatus() auf.

Beispielsweise mit den Eingaben Echo, HomeNetwork und Alexa:

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

Echo Status:
WiFi Status: Connected
Voice Status: Active

Die Methode showAllStatus() sollte den Gerätenamen gefolgt von " Status:" in einer Zeile ausgeben und anschließend die status()-Methode jeder Basisklasse mithilfe von WiFiDevice::status() und VoiceControl::status() aufrufen, um Mehrdeutigkeiten zu vermeiden, da beide Basisklassen eine Methode mit demselben Namen besitzen.

Probier es selbst

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

using namespace std;

// TODO: Definiere die Klasse SmartSpeaker, die öffentlich von WiFiDevice und VoiceControl erbt
// - Privates Mitglied: deviceName (string)
// - Konstruktor: nimmt deviceName, networkName, assistantName entgegen
//   Verwende die Initialisierungsliste, um networkName an WiFiDevice und assistantName an VoiceControl zu übergeben
// - powerOn() Methode: gibt "<deviceName> powering on..." aus, ruft dann connect() und listen() auf
// - showAllStatus() Methode: gibt "<deviceName> Status:" aus, ruft dann beide status() Methoden auf
//   unter Verwendung der Bereichsauflösung (WiFiDevice::status() und VoiceControl::status())

class SmartSpeaker {
    // TODO: Implementiere die Klasse SmartSpeaker hier
};

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

    // TODO: Erstelle ein SmartSpeaker Objekt mit den Eingabewerten
    // TODO: Rufe powerOn() auf
    // TODO: Gib eine Leerzeile aus
    // TODO: Rufe showAllStatus() auf

    return 0;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-C++-Compiler