Grundlagen der Vererbung
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 48 von 104.
Vererbung ermöglicht es einer Klasse, die Eigenschaften und Verhaltensweisen einer anderen Klasse zu übernehmen. Die Klasse, von der geerbt wird, wird als Basisklasse (oder Elternklasse) bezeichnet, und die Klasse, die erbt, wird als abgeleitete Klasse (oder Kindklasse) bezeichnet.
Um eine abgeleitete Klasse zu erstellen, verwenden Sie einen Doppelpunkt, gefolgt vom Zugriffsspezifizierer und dem Namen der Basisklasse:
class Animal {
public:
std::string name;
void eat() {
std::cout << name << " is eating" << std::endl;
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << name << " says woof!" << std::endl;
}
};Die Klasse Dog hat nun Zugriff sowohl auf name als auch auf eat() von Animal, sowie auf ihre eigene Methode bark(). Dies ist das Wesen der Vererbung: die Wiederverwendung von vorhandenem Code bei gleichzeitiger Hinzufügung neuer Funktionalität.
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Geerbt von Animal
myDog.bark(); // In Dog definiertDas Schlüsselwort public vor Animal gibt den Vererbungstyp an. Öffentliche Vererbung bedeutet, dass öffentliche Member der Basisklasse in der abgeleiteten Klasse öffentlich bleiben. Dies ist die häufigste Form und bildet eine „ist-ein“-Beziehung ab: Ein Hund ist ein Tier.
Aufgabe
EinfachErstellen wir eine einfache Fahrzeughierarchie, die Vererbung in der Praxis demonstriert. Du erstellst eine Basisklasse Vehicle und eine abgeleitete Klasse Motorcycle, die sie um spezielles Verhalten erweitert.
Du organisierst deinen Code auf drei Dateien verteilt:
Vehicle.h: Definiere eine BasisklasseVehiclemit:- einem öffentlichen
std::string brand-Member - einem öffentlichen
int year-Member - einer öffentlichen Methode
displayInfo(), die die Marke und das Baujahr des Fahrzeugs in folgendem Format ausgibt:Brand: <brand>, Year: <year>
- einem öffentlichen
Motorcycle.h: Definiere eine KlasseMotorcycle, die öffentlich vonVehicleerbt. Diese abgeleitete Klasse soll Folgendes hinzufügen:- ein öffentliches
int engineCC-Member für den Hubraum des Motors - eine öffentliche Methode
revEngine(), die Folgendes ausgibt:<brand> goes vroom vroom!
Die Klasse
Motorcycleerbt automatischbrand,yearunddisplayInfo()vonVehicle.- ein öffentliches
main.cpp: Lies drei Eingaben ein (jeweils in einer eigenen Zeile):- Markenname (String)
- Baujahr (Ganzzahl)
- Motorhubraum in CC (Ganzzahl)
Erstelle ein
Motorcycle-Objekt und setze seine geerbten Member (brandundyear) sowie sein eigenesengineCC-Member. Erzeuge anschließend die drei Ausgabezeilen in dieser Reihenfolge: Rufe zuerst die geerbte MethodedisplayInfo()auf, gib danach den Hubraum selbst mitstd::cout << "Engine: " << moto.engineCC << "cc" << std::endl;aus und rufe schließlich die motorradspezifische MethoderevEngine()auf. Dies demonstriert Vererbung, indem sowohl die geerbte Methode als auch die eigene Methode der abgeleiteten Klasse verwendet werden.Ausgabeformat:
Brand: <brand>, Year: <year> Engine: <engineCC>cc <brand> goes vroom vroom!
Wenn die Eingaben beispielsweise Harley, 2022 und 1200 lauten:
Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!Vergiss nicht, Header-Guards in deine Header-Dateien aufzunehmen und #include "Vehicle.h" in deinem Motorcycle-Header zu verwenden, um auf die Basisklasse zuzugreifen.
Probier es selbst
#include <iostream>
#include <string>
#include "Motorcycle.h"
using namespace std;
int main() {
string brand;
int year;
int engineCC;
cin >> brand;
cin >> year;
cin >> engineCC;
// TODO: Erstelle ein Motorcycle-Objekt
// TODO: Setze die Attribute brand, year und engineCC
// TODO: Rufe displayInfo() auf, um die geerbten Informationen anzuzeigen
// TODO: Gib die Motorinformationen im Format aus: Engine: <engineCC>cc
// TODO: Rufe revEngine() auf, um das motorradspezifische Verhalten zu demonstrieren
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler