cpp-polimorfismo

Qué es y cómo usar polimorfismo en C++

El polimorfismo es uno de los principios fundamentales de la programación orientada a objetos (POO), que permite que los objetos puedan ser tratados como instancias de su clase base, pero a la vez conservan su propio comportamiento específico.

Si quieres aprender más sobre programación orientada a objetos, te dejo el enlace al Curso de Programación orientada a objetos.

Funciones virtuales y sobreescritura

En C++, una función virtual es aquella que puede ser sobrescrita en clases derivadas, modificando o extendiendo su comportamiento con su propia implementación.

Para ello tienen que ser declaradas en la clase base con la palabra clave virtual

class Animal {
public:
    virtual void hacerSonido() const {
        cout << "El animal hace un sonido." << endl;
    }
};
class Perro : public Animal {
public:
    void hacerSonido() const override {
        cout << "El perro ladra." << endl;
    }
};
class Gato : public Animal {
public:
    void hacerSonido() const override {
        cout << "El gato maúlla." << endl;
    }
};

En el ejemplo anterior,

  • hacerSonido es una función virtual en la clase base Animal.
  • Tanto Perro como Gato sobrescriben este método para definir su propio sonido,

Usando el polimorfirmo

Ahora vamos a ver cómo funciona el polimorfismo. Creamos dos instancias de nuestras clases Perro y Gato, pero las guardamos en una variable de tipo Animal.

Ahora llamamos al método hacerSonido. ¿Qué es lo que va a pasar? ¿Saldrá el mensaje de El animal hace un sonido, que es lo que está definido en Animal?

Animal* miAnimal = new Perro();
miAnimal->hacerSonido(); // Salida: El perro ladra.

miAnimal = new Gato();
miAnimal->hacerSonido(); // Salida: El gato maúlla.

¡No! Perro hace su sonido, y gato hace el suyo. Es decir, cada instancia ejecuta el método sobrescrito en la clase concreta (Perro o Gato).

Este es el polimorfismo en acción. Permite que hacerSonido se ejecute según el tipo concreto del objeto que tengamos en tiempo de ejecución (no según la definición del tipo de variable).

Lo cuál no deja de ser lógico. Aunque accedemos a los objetos a través de una variable de tipo Animal, al ejecutar el método, lo que encontramos depende del objeto que esté almacenado.