// 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; }