Resumen - Jerarquía de empleados
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy — lección 55 de 104.
Desafío
FácilVamos a construir un sistema completo de jerarquía de empleados que reúna todos los conceptos de herencia que has aprendido en este capítulo. Crearás una estructura de empresa con diferentes tipos de empleados que comparten atributos comunes pero tienen comportamientos especializados.
Organizarás tu código en cuatro archivos:
Employee.h: Define la clase baseEmployeede la cual heredarán todos los tipos de empleados. Cada empleado tiene un nombre, un ID y un salario base. Incluye:- Miembros protegidos para el nombre (
std::string), id (int) y baseSalary (double) - Un constructor que inicializa los tres valores
- Un método virtual
displayInfo()que imprime:Employee: <name> (ID: <id>) - Un método virtual
calculateSalary()que devuelve el salario base - Un destructor virtual
- Miembros protegidos para el nombre (
Manager.h: Define una claseManagerque hereda públicamente deEmployee. Los gerentes reciben un bono basado en el tamaño de su equipo:- Un miembro privado
int teamSize - Un constructor que recibe el nombre, id, salario base y tamaño del equipo — encadenado al constructor base de forma apropiada
- Sobrescribe
displayInfo()para imprimir:Manager: <name> (ID: <id>) - Team of <teamSize> - Sobrescribe
calculateSalary()para devolver el salario base más 500 por cada miembro del equipo
- Un miembro privado
Developer.h: Define una claseDeveloperque hereda públicamente deEmployee. Los desarrolladores tienen un lenguaje de especialidad y obtienen un bono por habilidad:- Un miembro privado
std::string language - Un constructor que recibe el nombre, id, salario base y lenguaje de programación
- Sobrescribe
displayInfo()para imprimir:Developer: <name> (ID: <id>) - <language> - Sobrescribe
calculateSalary()para devolver el salario base más un bono por habilidad de 1000
- Un miembro privado
main.cpp: Lee seis entradas (cada una en una línea separada):- Nombre del Manager
- ID del Manager
- Salario base del Manager
- Nombre del Developer
- ID del Developer
- Salario base del Developer
Crea un Manager con un tamaño de equipo de 4 y un Developer que se especialice en "C++". Almacena punteros a ambos en un arreglo de punteros
Employee*. Recorre el arreglo para llamar adisplayInfo()e imprimir el salario calculado para cada empleado en este formato:<displayInfo output> Salary: <displayInfo output> Salary: $<calculated salary>lt;calculated salary>Imprime una línea en blanco entre empleados. Después de mostrar todos los empleados, elimina correctamente los objetos asignados dinámicamente.
Por ejemplo, con las entradas Sarah, 101, 5000, Mike, 102 y 4500:
Manager: Sarah (ID: 101) - Team of 4
Salary: $7000
Developer: Mike (ID: 102) - C++
Salary: $5500Este desafío demuestra el polimorfismo en acción: llamar a métodos virtuales a través de punteros de la clase base invoca las implementaciones correctas de la clase derivada. Recuerda usar la palabra clave override e incluir un destructor virtual en tu clase base para una limpieza adecuada.
Pruébalo tú mismo
#include <iostream>
#include <string>
#include "Employee.h"
#include "Manager.h"
#include "Developer.h"
using namespace std;
int main() {
// Leer las entradas del Manager
string managerName;
int managerId;
double managerSalary;
getline(cin, managerName);
cin >> managerId;
cin >> managerSalary;
cin.ignore();
// Leer las entradas del Developer
string developerName;
int developerId;
double developerSalary;
getline(cin, developerName);
cin >> developerId;
cin >> developerSalary;
// TODO: Crear un Manager con un tamaño de equipo de 4
// TODO: Crear un Developer que se especialice en "C++"
// TODO: Crear un arreglo de punteros Employee* para almacenar a ambos empleados
// TODO: Recorrer el arreglo y para cada empleado:
// - Llamar a displayInfo()
// - Imprimir: Salary: $<calculated salary>
// - Imprimir una línea en blanco entre empleados (no después del último)
// TODO: Eliminar los objetos asignados dinámicamente
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosConstrucción y compilación en C++Archivos de cabecera y archivos fuenteNamespaces y alcanceIntroducción a OOP en C++Clases vs ObjetosEl puntero 'this'Métodos (Funciones miembro)Atributos (Miembros de datos)Conceptos básicos de Ctors y DtorsResumen - Calculadora simple4Propiedades de clase
Miembros de instancia vs. estáticosGetters y SettersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases amigasResumen - Gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de Ctor y DtorSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualResumen - Jerarquía de empleados2Gestión de memoria
Memoria Stack vs HeapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Resumen - Gestor de arrays dinámicos5Encapsulamiento
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultamiento de informaciónStruct vs ClassClases anidadas e internasResumen - Sistema de registros de estudiantes8Polimorfismo
Polimorfismo: Compilación vs. Tiempo de ejecuciónSobrecarga de funcionesFunciones virtuales revisadasFunciones virtuales purasClases abstractasDiseño de interfaces en C++Dynamic Casting y RTTIResumen: Calculadora de figuras11Conceptos avanzados de POO
Composición vs. HerenciaMixins mediante CRTPIdioma PimplBorrado de tiposEnum Classes y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño - Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y Destructores
Constructor por defectoConstructor parametrizadoConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis profundo del destructorRegla de tres / cinco / ceroResumen - Clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujo (Stream)Sobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tiposResumen - Clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasConceptos básicos de SFINAE y Type TraitsResumen - Contenedor genérico