#include #include // Declaración adelantada para la función friend class Maquina; class AuditoriaFinanzas { public: static void calcularAmortizacion(const Maquina& m); }; // ------------------------------------------------------------- // CLASE BASE: Maquina // ------------------------------------------------------------- class Maquina { protected: std::string idMaquina; double horasUso; double costoBaseHora; public: Maquina(std::string id, double horas, double costoBase) : idMaquina(id), horasUso(horas), costoBaseHora(costoBase) {} virtual ~Maquina() {} // Método POLIMÓRFICO (virtual) virtual double calcularCostoMantenimiento() const { return horasUso * costoBaseHora; } virtual void mostrarFicha() const { std::cout << "ID Maquina: " << idMaquina << " | Horas: " << horasUso << " hs" << std::endl; } // Declaración de función FRIEND para auditoría externa friend void AuditoriaFinanzas::calcularAmortizacion(const Maquina& m); }; // ------------------------------------------------------------- // CLASE DERIVADA 1: PrensaHydraulica (HERENCIA) // ------------------------------------------------------------- class PrensaHydraulica : public Maquina { private: double presionPSI; public: PrensaHydraulica(std::string id, double horas, double costoBase, double presion) : Maquina(id, horas, costoBase), presionPSI(presion) {} // Redefinición POLIMÓRFICA del cálculo de costo double calcularCostoMantenimiento() const override { double costoBaseCalculado = Maquina::calcularCostoMantenimiento(); if (horasUso > 500.0) { return costoBaseCalculado * 1.20; // Recargo del 20% } return costoBaseCalculado; } void mostrarFicha() const override { Maquina::mostrarFicha(); std::cout << " Tipo: Prensa Hidraulica | Presion: " << presionPSI << " PSI" << std::endl; } }; // ------------------------------------------------------------- // CLASE DERIVADA 2: RobotSoldadura (HERENCIA) // ------------------------------------------------------------- class RobotSoldadura : public Maquina { private: int numeroEjes; public: RobotSoldadura(std::string id, double horas, double costoBase, int ejes) : Maquina(id, horas, costoBase), numeroEjes(ejes) {} // Redefinición POLIMÓRFICA del cálculo de costo double calcularCostoMantenimiento() const override { return Maquina::calcularCostoMantenimiento() + 500.0; // Adicional fijo por calibración } void mostrarFicha() const override { Maquina::mostrarFicha(); std::cout << " Tipo: Robot Soldadura | Ejes: " << numeroEjes << std::endl; } }; // ------------------------------------------------------------- // IMPLEMENTACIÓN DE LA FUNCIÓN FRIEND // ------------------------------------------------------------- void AuditoriaFinanzas::calcularAmortizacion(const Maquina& m) { // Acceso DIRECTO a miembros protegidos/privados gracias a 'friend' double valorResidual = (m.horasUso * m.costoBaseHora) * 0.15; std::cout << "[AUDITORIA FINANZAS] Maquina " << m.idMaquina << " -> Valor Residual Estimado: $" << valorResidual << std::endl; } // ------------------------------------------------------------- // PROGRAMA PRINCIPAL // ------------------------------------------------------------- int main() { // 1. HERENCIA Y CONSTRUCTORES PrensaHydraulica prensa1("PR-01", 600.0, 50.0, 2200.0); // > 500 hs (Aplica recargo) RobotSoldadura robot1("RB-02", 300.0, 40.0, 6); std::cout << "=== FICHAS DE EQUIPOS ===" << std::endl; prensa1.mostrarFicha(); robot1.mostrarFicha(); // 2. POLIMORFISMO (Tratamiento uniforme de objetos mediante punteros a la clase Base) std::cout << "\n=== CALCULANDO COSTOS DE MANTENIMIENTO (POLIMORFISMO) ===" << std::endl; Maquina* inventario[2]; inventario[0] = &prensa1; inventario[1] = &robot1; for (int i = 0; i < 2; i++) { // Llama al método correspondiente de cada clase derivada en tiempo de ejecución std::cout << "Costo de Mantenimiento Equipo " << i + 1 << ": $" << inventario[i]->calcularCostoMantenimiento() << std::endl; } // 3. USO DE LA FUNCIÓN FRIEND std::cout << "\n=== ACCESO MEDIANTE FUNCION FRIEND ===" << std::endl; AuditoriaFinanzas::calcularAmortizacion(prensa1); AuditoriaFinanzas::calcularAmortizacion(robot1); return 0; }