Rückblick – Mitarbeiterhierarchie
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 55 von 104.
Aufgabe
EinfachErstellen wir ein vollständiges System für eine Mitarbeiterhierarchie, das alle Vererbungskonzepte zusammenführt, die du in diesem Kapitel gelernt hast. Du erstellst eine Unternehmensstruktur mit verschiedenen Mitarbeitertypen, die gemeinsame Attribute haben, sich aber durch spezialisierte Verhaltensweisen unterscheiden.
Du organisierst deinen Code auf vier Dateien verteilt:
Employee.h: Definiere dieEmployee-Klasse als baseEmployee-Klasse, von der alle Mitarbeitertypen erben werden. Jeder Mitarbeiter hat einen Namen, eine ID und ein base-Gehalt. Füge Folgendes ein:- Geschützte Member für name (
std::string), id (int) und baseSalary (double) - Einen Konstruktor, der alle drei Werte initialisiert
- Eine virtuelle
displayInfo()-Methode, die Folgendes ausgibt:Employee: <name> (ID: <id>) - Eine virtuelle
calculateSalary()-Methode, die das base-Gehalt zurückgibt - Einen virtuellen Destruktor
- Geschützte Member für name (
Manager.h: Definiere eineManager-Klasse, die öffentlich vonEmployeeerbt. Manager erhalten einen Bonus basierend auf ihrer Teamgröße:- Ein privates
int teamSize-Member - Einen Konstruktor, der name, id, base-Gehalt und teamSize übernimmt: Rufe den base-Konstruktor entsprechend auf
- Überschreibe
displayInfo(), sodass Folgendes ausgegeben wird:Manager: <name> (ID: <id>) - Team of <teamSize> - Überschreibe
calculateSalary(), sodass das base-Gehalt plus 500 für jedes Teammitglied zurückgegeben wird
- Ein privates
Developer.h: Definiere eineDeveloper-Klasse, die öffentlich vonEmployeeerbt. Developer haben eine Spezialsprache und erhalten einen Kompetenzbonus:- Ein privates
std::string language-Member - Einen Konstruktor, der name, id, base-Gehalt und Programmiersprache übernimmt
- Überschreibe
displayInfo(), sodass Folgendes ausgegeben wird:Developer: <name> (ID: <id>) - <language> - Überschreibe
calculateSalary(), sodass das base-Gehalt plus ein Kompetenzbonus von 1000 zurückgegeben wird
- Ein privates
main.cpp: Lies sechs Eingaben ein (jeweils in einer eigenen Zeile):- Managername
- Manager-ID
- Manager-base-Gehalt
- Developername
- Developer-ID
- Developer-base-Gehalt
Erstelle einen Manager mit der Teamgröße 4 und einen Developer, der sich auf "C++" spezialisiert. Speichere Zeiger auf beide in einem Array aus
Employee*-Zeigern. Durchlaufe das Array, um für jeden MitarbeiterdisplayInfo()aufzurufen und das berechnete Gehalt in diesem Format auszugeben:<displayInfo output> Salary: $<calculated salary>Gib zwischen den Mitarbeitern eine leere Zeile aus. Lösche nach der Anzeige aller Mitarbeiter die dynamisch reservierten Objekte ordnungsgemäß.
Beispielsweise mit den Eingaben Sarah, 101, 5000, Mike, 102 und 4500:
Manager: Sarah (ID: 101) - Team of 4
Salary: $7000
Developer: Mike (ID: 102) - C++
Salary: $5500Diese Aufgabe demonstriert Polymorphie in der Praxis: Das Aufrufen virtueller Methoden über Zeiger auf die base class ruft die korrekten Implementierungen der abgeleiteten Klassen auf. Denke daran, das Schlüsselwort override zu verwenden und einen virtuellen Destruktor in deiner base class einzuschließen, damit die Bereinigung ordnungsgemäß erfolgt.
Probier es selbst
#include <iostream>
#include <string>
#include "Employee.h"
#include "Manager.h"
#include "Developer.h"
using namespace std;
int main() {
// Manager-Eingaben lesen
string managerName;
int managerId;
double managerSalary;
getline(cin, managerName);
cin >> managerId;
cin >> managerSalary;
cin.ignore();
// Developer-Eingaben lesen
string developerName;
int developerId;
double developerSalary;
getline(cin, developerName);
cin >> developerId;
cin >> developerSalary;
// TODO: Erstelle einen Manager mit Teamgröße 4
// TODO: Erstelle einen Developer, der sich auf "C++" spezialisiert
// TODO: Erstelle ein Array von Employee*-Zeigern, um beide Mitarbeiter zu speichern
// TODO: Durchlaufe das Array und für jeden Mitarbeiter:
// - Rufe displayInfo() auf
// - Gib aus: Salary: $<berechnetes Gehalt>
// - Gib eine Leerzeile zwischen den Mitarbeitern aus (nicht nach dem letzten)
// TODO: Lösche die dynamisch allokierten Objekte
return 0;
}
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