Después de de esta prolongada búsqueda de información hemos podido solucionar esta incógnita que tienen muchos de nuestros lectores. Te dejamos la solución y deseamos resultarte de mucha ayuda.
Solución:
Parece que no entiendes lo que es el polimorfismo.
El polimorfismo, en esencia, no tiene nada que ver con las clases derivadas. El polimorfismo simplemente significa la capacidad de usar un tipo sin saber todo sobre él. En lugar de usar un tipo concreto, el polimorfismo se basa en algún tipo de prototipo para definir qué tipos necesita. Se acepta cualquier tipo que se ajuste a ese prototipo.
El polimorfismo en tiempo de ejecución, en C++, se obtiene al derivar clases de una clase base que contiene funciones virtuales. La clase base y las funciones virtuales forman el prototipo polimórfico. El código escrito para aceptar la clase base que llama a estas funciones virtuales aceptará ninguna instancia de clase derivada de la clase base.
Tiempo de compilación polimorfismo es polimorfismo que ocurre… en tiempo de compilación 😉 Lo que esto significa es que el compilador debe saber Que esta pasando. Es posible que haya escrito el código C++ contra un prototipo polimórfico, pero al compilador no le importa. Obtiene tipos concretos específicos después de la compilación.
El polimorfismo en tiempo de compilación lo proporcionan las plantillas en C++. Una función o clase de plantilla puede tomar cualquier tipo que se ajuste a un prototipo, generalmente llamado “concepto”. A diferencia de las clases base y las funciones virtuales, el prototipo es implícito: el prototipo se define solo por cómo es el tipo usado por la función/clase de plantilla.
Si tiene esta función de plantilla:
template
void Stuff(T &t)
t.call(15);
Hay un implícito requisito sobre T
. Este requisito es que tenga una función miembro llamada call
. Debe haber una única sobrecarga de esta función miembro a la que se pueda llamar con un valor entero.
Esto significa que ninguna Se puede usar el tipo que se ajuste a este prototipo.
El polimorfismo de plantilla es más amplio que el polimorfismo de herencia, porque puede ser utilizado por un grupo más amplio. array de tipos Un tipo debe diseñarse específicamente para usar el polimorfismo de herencia; tienes que derivar de una clase. Un tipo puede adaptarse de forma no destructiva (es decir, no tiene que cambiar el tipo en sí) al polimorfismo de plantilla. Más aún si tu prototipo de plantilla está bien diseñado:
template
void Stuff(T &t)
call(t, 15);
Todo lo que esta versión de Stuff
requiere es que haya alguna función que tome un T&
y un valor entero. Si tengo algún tipo que quiero usar con Stuff
todo lo que tengo que hacer es definir un call
en un espacio de nombres adecuado (es decir, el espacio de nombres en el que se definió el tipo). Y esto funcionará bien. Todo sin modificando el tipo en sí.
Por supuesto, el polimorfismo en tiempo de compilación es… tiempo de compilación. Si quiero alguna entrada de usuario o archivo de datos para seleccionar el tipo polimórfico, las plantillas no van a ayudar mucho (aunque el borrado de tipos, una técnica basada en plantillas, puede ayudar). El principal beneficio del polimorfismo en tiempo de ejecución es que, de hecho, es tiempo de ejecución.
Otro beneficio es que es más preciso acerca de sus prototipos. Todo se establece explícitamente sobre la herencia. La interfaz de función virtual en una clase base está claramente diseñada. El compilador evitará que intentes usar esa clase base incorrectamente (llamando a métodos que no existen en ella). De hecho, un IDE decente guiará su código para que solo vea los métodos en la clase base.
El polimorfismo de plantilla es mucho más implícito. Dado que C++ no tiene forma de deletrear el prototipo que una función/clase de plantilla en particular pone en un tipo, es muy fácil llamar accidentalmente a algo en un tipo de plantilla que no debería. El compilador solo detectará esto cuando intente usar un tipo que no se ajuste al prototipo. E incluso entonces, generalmente obtendrá un error masivo (dependiendo de cuán profundamente anidado esté su código de plantilla) que dificulta saber dónde está el problema.
También es mucho más difícil implementar el prototipo polimórfico de plantilla implícito, ya que no está detallado. La implementación de una clase derivada requiere recorrer la clase base, observar todas las funciones virtuales e implementarlas. Hacer esto para un prototipo de plantilla es mucho más difícil, a menos que haya documentación en alguna parte que lo explique. Si no implementa algo, nuevamente obtiene un mensaje de error que generalmente es menos que comunicativo sobre el problema.
Si conservas algún recelo o forma de reformar nuestro post eres capaz de dejar una explicación y con placer lo observaremos.