Translate

miércoles, 11 de diciembre de 2024

Tipos de Polimorfismo en C++


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.