Rückblick - Mitarbeiter-Hierarchie
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 55 von 104.
Aufgabe
EinfachLassen Sie uns ein vollständiges Mitarbeiter-Hierarchiesystem aufbauen, das alle Vererbungskonzepte zusammenführt, die Sie in diesem Kapitel gelernt haben. Sie werden eine Unternehmensstruktur mit verschiedenen Mitarbeitertypen erstellen, die gemeinsame Attribute teilen, aber spezialisierte Verhaltensweisen aufweisen.
Sie werden Ihren Code über vier Dateien organisieren:
Employee.h: Definieren Sie die BasisklasseEmployee, von der alle Mitarbeitertypen erben werden. Jeder Mitarbeiter hat einen Namen, eine ID und ein Grundgehalt. Enthalten sein müssen:- Geschützte (protected) Member für den Namen (
std::string), die ID (int) und das Grundgehalt (double) - Ein Konstruktor, der alle drei Werte initialisiert
- Eine virtuelle
displayInfo()Methode, die Folgendes ausgibt:Employee: <name> (ID: <id>) - Eine virtuelle
calculateSalary()Methode, die das Grundgehalt zurückgibt - Ein virtueller Destruktor
- Geschützte (protected) Member für den Namen (
Manager.h: Definieren Sie eine KlasseManager, die öffentlich vonEmployeeerbt. Manager erhalten einen Bonus basierend auf ihrer Teamgröße:- Ein privates
int teamSizeMember - Ein Konstruktor, der Name, ID, Grundgehalt und Teamgröße entgegennimmt — verketten Sie diesen angemessen mit dem Basis-Konstruktor
- Überschreiben Sie
displayInfo(), um Folgendes auszugeben:Manager: <name> (ID: <id>) - Team of <teamSize> - Überschreiben Sie
calculateSalary(), um das Grundgehalt plus 500 für jedes Teammitglied zurückzugeben
- Ein privates
Developer.h: Definieren Sie eine KlasseDeveloper, die öffentlich vonEmployeeerbt. Entwickler haben eine spezialisierte Sprache und erhalten einen Qualifikationsbonus:- Ein privates
std::string languageMember - Ein Konstruktor, der Name, ID, Grundgehalt und Programmiersprache entgegennimmt
- Überschreiben Sie
displayInfo(), um Folgendes auszugeben:Developer: <name> (ID: <id>) - <language> - Überschreiben Sie
calculateSalary(), um das Grundgehalt plus einen Qualifikationsbonus von 1000 zurückzugeben
- Ein privates
main.cpp: Lesen Sie sechs Eingaben ein (jede in einer separaten Zeile):- Name des Managers
- ID des Managers
- Grundgehalt des Managers
- Name des Entwicklers
- ID des Entwicklers
- Grundgehalt des Entwicklers
Erstellen Sie einen Manager mit einer Teamgröße von 4 und einen Entwickler, der sich auf "C++" spezialisiert hat. Speichern Sie Zeiger auf beide in einem Array von
Employee*Zeigern. Durchlaufen Sie das Array in einer Schleife, umdisplayInfo()aufzurufen und das berechnete Gehalt für jeden Mitarbeiter in diesem Format auszugeben:<displayInfo output> Salary: <displayInfo output> Salary: $<calculated salary>lt;calculated salary>Geben Sie eine Leerzeile zwischen den Mitarbeitern aus. Nachdem alle Mitarbeiter angezeigt wurden, löschen Sie die dynamisch zugewiesenen Objekte ordnungsgemäß.
Zum Beispiel 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 Herausforderung demonstriert Polymorphismus in Aktion — der Aufruf virtueller Methoden über Basisklassen-Zeiger ruft die korrekten Implementierungen der abgeleiteten Klassen auf. Denken Sie daran, das Schlüsselwort override zu verwenden und einen virtuellen Destruktor in Ihrer Basisklasse für eine ordnungsgemäße Bereinigung einzufügen.
Probier es selbst
#include <iostream>
#include <string>
#include "Employee.h"
#include "Manager.h"
#include "Developer.h"
using namespace std;
int main() {
// Eingaben für Manager lesen
string managerName;
int managerId;
double managerSalary;
getline(cin, managerName);
cin >> managerId;
cin >> managerSalary;
cin.ignore();
// Eingaben für Developer lesen
string developerName;
int developerId;
double developerSalary;
getline(cin, developerName);
cin >> developerId;
cin >> developerSalary;
// TODO: Erstelle einen Manager mit einer Teamgröße von 4
// TODO: Erstelle einen Developer, der sich auf "C++" spezialisiert
// TODO: Erstelle ein Array von Employee* Pointern, um beide Mitarbeiter zu speichern
// TODO: Iteriere durch das Array und für jeden Mitarbeiter:
// - Rufe displayInfo() auf
// - Gib aus: Salary: $<calculated salary>
// - Gib eine Leerzeile zwischen den Mitarbeitern aus (nicht nach dem letzten)
// TODO: Lösche die dynamisch allozierten Objekte
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische Container