Riepilogo - Gerarchia dei dipendenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 55 di 104.
Sfida
FacileCostruiamo un sistema completo di gerarchia dei dipendenti che riunisce tutti i concetti di ereditarietà che hai imparato in questo capitolo. Creerai la struttura di un'azienda con diversi tipi di dipendenti che condividono attributi comuni, ma hanno comportamenti specifici.
Organizzerai il codice in quattro file:
Employee.h: Definisci la classe baseEmployeeda cui erediteranno tutti i tipi di dipendenti. Ogni dipendente ha un nome, un ID e uno stipendio base. Includi:- Membri protetti per il nome (
std::string), l'ID (int) e baseSalary (double) - Un costruttore che inizializza tutti e tre i valori
- Un metodo virtuale
displayInfo()che stampa:Employee: <name> (ID: <id>) - Un metodo virtuale
calculateSalary()che restituisce lo stipendio base - Un distruttore virtuale
- Membri protetti per il nome (
Manager.h: Definisci una classeManagerche eredita pubblicamente daEmployee. I manager ricevono un bonus basato sulle dimensioni della squadra:- Un membro privato
int teamSize - Un costruttore che accetta nome, ID, stipendio base e dimensioni della squadra: richiama correttamente il costruttore della classe base
- Sovrascrivi
displayInfo()affinché stampi:Manager: <name> (ID: <id>) - Team of <teamSize> - Sovrascrivi
calculateSalary()affinché restituisca lo stipendio base più 500 per ogni membro della squadra
- Un membro privato
Developer.h: Definisci una classeDeveloperche eredita pubblicamente daEmployee. Gli sviluppatori hanno una lingua di specializzazione e ricevono un bonus per le competenze:- Un membro privato
std::string language - Un costruttore che accetta nome, ID, stipendio base e linguaggio di programmazione
- Sovrascrivi
displayInfo()affinché stampi:Developer: <name> (ID: <id>) - <language> - Sovrascrivi
calculateSalary()affinché restituisca lo stipendio base più un bonus di 1000 per le competenze
- Un membro privato
main.cpp: Leggi sei input (ciascuno su una riga separata):- Nome del manager
- ID del manager
- Stipendio base del manager
- Nome dello sviluppatore
- ID dello sviluppatore
- Stipendio base dello sviluppatore
Crea un Manager con una squadra di 4 persone e un Developer specializzato in "C++". Memorizza i puntatori a entrambi in un array di puntatori
Employee*. Scorri l'array per chiamaredisplayInfo()e stampare lo stipendio calcolato di ciascun dipendente in questo formato:<displayInfo output> Salary: $<calculated salary>Stampa una riga vuota tra i dipendenti. Dopo aver visualizzato tutti i dipendenti, elimina correttamente gli oggetti allocati dinamicamente.
Ad esempio, con gli input Sarah, 101, 5000, Mike, 102 e 4500:
Manager: Sarah (ID: 101) - Team of 4
Salary: $7000
Developer: Mike (ID: 102) - C++
Salary: $5500Questa sfida dimostra il polimorfismo in azione: chiamare metodi virtuali tramite puntatori alla classe base invoca le implementazioni corrette delle classi derivate. Ricorda di usare la parola chiave override e di includere un distruttore virtuale nella classe base per una corretta pulizia.
Provalo tu
#include <iostream>
#include <string>
#include "Employee.h"
#include "Manager.h"
#include "Developer.h"
using namespace std;
int main() {
// Read Manager inputs
string managerName;
int managerId;
double managerSalary;
getline(cin, managerName);
cin >> managerId;
cin >> managerSalary;
cin.ignore();
// Read Developer inputs
string developerName;
int developerId;
double developerSalary;
getline(cin, developerName);
cin >> developerId;
cin >> developerSalary;
// TODO: Create a Manager with team size 4
// TODO: Create a Developer who specializes in "C++"
// TODO: Create an array of Employee* pointers to store both employees
// TODO: Loop through the array and for each employee:
// - Call displayInfo()
// - Print: Salary: $<calculated salary>
// - Print a blank line between employees (not after the last one)
// TODO: Delete the dynamically allocated objects
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online