Menu
CoddyTech

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. Das nennt man Mehrfachvererbung und ermöglicht es dir, Merkmale aus verschiedenen Klassenhierarchien zu kombinieren.

Um von mehreren Klassen zu erben, trenne sie 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 jetzt Zugriff auf Methoden von Printer und Scanner:

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

Konstruktoren werden in der Reihenfolge aufgerufen, in der die Basisklassen in der Vererbungserklärung aufgeführt sind (von links nach rechts), und Destruktoren in umgekehrter Reihenfolge. Du kannst jedem Basiskonstruktor Argumente in der Initialisierungsliste übergeben:

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

Ein mögliches Problem tritt auf, wenn beide Basisklassen ein Element mit demselben Namen haben. Dadurch entsteht Mehrdeutigkeit, und du musst den Bereichsauflösungsoperator verwenden, um anzugeben, welches Element du meinst:

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 leistungsfähig, kann aber zu komplexen Situationen führen, insbesondere wenn Basisklassen einen gemeinsamen Vorfahren haben. Diese Herausforderung betrachten wir in der nächsten Lektion.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Smart-Home-Gerätesystem, das mithilfe von Mehrfachvererbung Funktionen aus mehreren Basisklassen kombiniert. Du erstellst Geräte, die sich sowohl mit WiFi verbinden als auch per Sprache steuern lassen, und kombinierst diese Funktionen anschließend in einem einheitlichen Smart Speaker.

Du verteilst deinen Code auf drei Dateien:

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

    Definiere eine Klasse SmartSpeaker, die öffentlich sowohl von WiFiDevice als auch von VoiceControl erbt:

    • Ein privates Mitglied std::string deviceName
    • 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 Methode powerOn(), die Folgendes ausgibt: <deviceName> powering on..., und danach connect() und listen() aufruft
    • Eine Methode showAllStatus(), die den Gerätenamen ausgibt und anschließend den Bereichsauflösungsoperator verwendet, um beide Methoden status() aufzurufen und so die Mehrdeutigkeit aufzulösen

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

Zum Beispiel bei 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 Methode status() jeder Basisklasse mit WiFiDevice::status() und VoiceControl::status() aufrufen, um Mehrdeutigkeiten zu vermeiden, da beide Basisklassen eine Methode mit demselben Namen haben.

Probier es selbst

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

using namespace std;

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

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

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