El polimorfismo es uno de los pilares fundamentales de la programación orientada a objetos (POO) y permite a los objetos comportarse de diferentes maneras según el contexto. En C++, C# y Java y casi cualquier lenguaje orientado a objetos, se manifiesta principalmente de dos formas: en tiempo de compilación y en tiempo de ejecución.
Polimorfismo en Tiempo de Compilación (Static Polymorphism): Este tipo de polimorfismo ocurre cuando la decisión sobre qué función ejecutar se toma en tiempo de compilación. En C++, se logra a través de sobrecarga de funciones y plantillas (o template).
Se define más de una función con el mismo nombre pero diferentes parámetros.
#include <iostream>
using namespace std;
void imprimir(int x) {
cout << "Número entero: " << x << endl;
}
void imprimir(double x) {
cout << "Número decimal: " << x << endl;
}
int main() {
imprimir(10); // Llama a la versión para enteros
imprimir(3.14); // Llama a la versión para dobles
return 0;
}
Las plantillas permiten definir funciones o clases genéricas que trabajan con diferentes tipos de datos.
#include <iostream>
using namespace std;
template <typename T>
void imprimir(T x) {
cout << "Valor: " << x << endl;
}
int main() {
imprimir(10); // Entero
imprimir(3.14); // Decimal
imprimir("Hola"); // Cadena de texto
return 0;
}
Polimorfismo en Tiempo de Ejecución (Dynamic Polymorphism): Este tipo de polimorfismo ocurre cuando la decisión sobre qué función ejecutar se toma en tiempo de ejecución. En C++, esto se logra mediante herencia y métodos virtuales.
Los métodos virtuales permiten que una clase derivada sobrescriba el comportamiento de una función definida en la clase base.
#include <iostream>
using namespace std;
class Forma {
public:
virtual void dibujar() {
cout << "Dibujar una forma genérica" << endl;
}
};
class Circulo : public Forma {
public:
void dibujar() override {
cout << "Dibujar un círculo" << endl;
}
};
class Cuadrado : public Forma {
public:
void dibujar() override {
cout << "Dibujar un cuadrado" << endl;
}
};
int main() {
Forma* forma;
Circulo circulo;
Cuadrado cuadrado;
forma = &circulo;
forma->dibujar(); // Llama al método de Circulo
forma = &cuadrado;
forma->dibujar(); // Llama al método de Cuadrado
return 0;
}
Si una clase tiene al menos un método virtual puro, se convierte en una clase abstracta y no puede ser instanciada directamente.
#include <iostream>
using namespace std;
class Forma {
public:
virtual void dibujar() = 0; // Método virtual puro
};
class Triangulo : public Forma {
public:
void dibujar() override {
cout << "Dibujar un triángulo" << endl;
}
};
int main() {
Forma* forma = new Triangulo();
forma->dibujar(); // Llama al método de Triangulo
delete forma;
return 0;
}
El polimorfismo es una herramienta esencial en C++, que ofrece flexibilidad y reutilización de código. El polimorfismo estático es ideal para optimizar el rendimiento, mientras que el polimorfismo dinámico es crucial para diseños extensibles y adaptables.