Sobes.tech
Middle+

¿Cómo se llama la idioma del polimorfismo estático en C++?

sobes.tech AI

Respuesta de la IA

Patrón de plantilla que se repite curiosamente (CRTP), también conocido como polimorfismo estático o polimorfismo en tiempo de compilación.

El principio de CRTP se basa en que la clase plantilla Base utiliza como parámetro de plantilla a sí misma, siendo a la vez la clase base para alguna clase derivada Derived.

template <typename T>
class Base
{
public:
    void interfaceMethod()
    {
        // Llamada estática al método 'implementationMethod'
        // en un objeto de tipo Derived (que es T)
        static_cast<T*>(this)->implementationMethod();
    }

    // No es necesario un método virtual aquí
};

class Derived : public Base<Derived>
{
public:
    void implementationMethod()
    {
        // Implementación específica para Derived
        // ...
    }
};

Ventajas del CRTP frente al polimorfismo dinámico (con funciones virtuales):

  • Rendimiento: Las llamadas a funciones son estáticas y se resuelven en tiempo de compilación, evitando los costes adicionales de la tabla virtual.
  • Ausencia de costes adicionales por funciones virtuales: No es necesario almacenar ni usar vptr/vtbl.
  • Tipo más estricto: Los errores relacionados con incompatibilidades de tipos o falta de implementación se detectan en tiempo de compilación.

Desventajas:

  • Necesidad de conocer el tipo del descendiente: La clase base debe ser plantilla y "saber" el tipo de la clase derivada.
  • Complejidad para principiantes: El patrón puede ser menos intuitivo en comparación con la herencia clásica con funciones virtuales.
  • Imposibilidad de trabajar con colecciones de diferentes tipos CRTP: No se pueden almacenar en un contenedor objetos de diferentes clases derivadas CRTP y llamarlos a través de un puntero/enlace base.

Comparación con el polimorfismo dinámico:

Aspecto CRTP (polimorfismo estático) Polimorfismo dinámico (funciones virtuales)
Resolución de llamada En tiempo de compilación En tiempo de ejecución
Rendimiento Mayor (sin costes de vtbl) Menor (con costes de vtbl)
Costes adicionales No vptr/vtbl Con vptr/vtbl
Flexibilidad (colecciones) No (no se puede trabajar con tipos heterogéneos mediante puntero/enlace base común) Sí (se puede trabajar con tipos heterogéneos)
Detección de errores En tiempo de compilación En tiempo de ejecución
Complejidad Mayor para principiantes Menor para principiantes