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 |