Lecciones del módulo (2/2)
Polimorfismo y funciones virtuales
El Polimorfismo permite tratar objetos de diferentes clases derivadas a través de un puntero o referencia a su clase base, garantizando la ejecución de la versión correcta de cada método en tiempo de ejecución (Late Binding).
Funciones Virtuales: virtual y override
Para habilitar el polimorfismo en un método, debemos declararlo con la palabra clave virtual dentro de la clase base. En las clases derivadas, utilizamos el especificador override para indicar explícitamente que estamos sobrescribiendo dicho método.
class Employee {
public:
virtual void work() {
std::cout << "Lavoro generico" << std::endl;
}
// IMPORTANTE: Destructor virtual en la clase base para evitar fugas de memoria
virtual ~Employee() = default;
};
class Developer : public Employee {
public:
void work() override {
std::cout << "Scrittura codice in C++" << std::endl;
}
};
Utilizando punteros a la clase base, C++ resolverá el método correcto en tiempo de ejecución:
Employee* emp = new Developer();
emp->work(); // Stampa "Scrittura codice in C++" invece di "Lavoro generico"
delete emp;
Clases Abstractas y Funciones Virtuales Puras
Una función virtual pura es una función miembro virtual declarada con = 0 al final. Representa un contrato formal: la clase base no proporciona ninguna implementación, delegándola por completo en las subclases.
Una clase que contiene al menos una función virtual pura se denomina Clase Abstracta y no se puede instanciar directamente.
class Instrument {
public:
virtual void play() = 0; // Virtuale pura
virtual ~Instrument() = default;
};
class Piano : public Instrument {
public:
void play() override {
std::cout << "Suono del pianoforte..." << std::endl;
}
};
Pruébalo tú mismo
Define un método virtual makeSound() in Animal que imprima 'Some sound'. A continuación, sobrescríbelo en la clase Cat utilizando el especificador override para imprimir 'Meow'.
Mostrar pista
Recuerda anteponer `virtual` al método de la clase base y colocar `override` después de los paréntesis de los parámetros en la clase derivada.
Solución disponible después de 3 intentos
Declara una función virtual pura print() que devuelva void dentro de la clase abstracta Printable. Crea luego la clase Document que herede de forma public de Printable e implemente el método print() para imprimir 'Printing Document'.
Mostrar pista
Una función virtual pura se declara con la firma `virtual void print() = 0;`. Asegúrate de que `Document` herede en modo public de `Printable`.
Solución disponible después de 3 intentos