De acuerdo, el título es agotador y creo que probablemente sea por eso que ha sido difícil encontrar una respuesta a través de google o de este sitio. Puede ser que no sepa cómo expresar correctamente el problema, pero aquí va:Coincidencia de una función sobrecargada con su argumento polimórfico
Tengo una serie de métodos en una clase SimpleOpenGLRenderer
que toman un único argumento que amplía la clase Model
. Entonces, la idea es que, dependiendo del tipo de modelo, el procesador invocará el método correcto que sepa cómo renderizarlo. Aquí es un ejemplo ejecutable simplificado basado en el problema:
#include <stdio.h>
class Model {};
class Cube : public Model {};
class Sphere : public Model {};
class Renderer
{
public:
virtual void renderModel(const Model& model) = 0;
};
class SimpleOpenGLRenderer
{
public:
void renderModel(const Cube& model)
{
printf("Render the cube.\n");
}
void renderModel(const Model& model)
{
printf("Throw an exception, my renderer does not support the model type you have provided.\n");
}
void renderModel(const Sphere& model)
{
printf("Render the sphere.\n");
}
};
int
main(int argc, char** argv)
{
Cube cube;
Model& model = cube;
SimpleOpenGLRenderer renderer;
renderer.renderModel(cube);
renderer.renderModel(model);
}
El resultado del ejemplo es:
Render the cube.
Throw an exception, my renderer does not support the model type you have provided.
Puede parecer obvio para un desarrollador de C más experimentado ++ que esto no funciona según lo previsto, pero simplemente no tiene sentido para mí. En tiempo de ejecución no sabré el tipo exacto de Model
pasado al procesador (de ahí la sobrecarga intentada para resolverlo). Procedente de un fondo Java, he usado esta técnica antes y en Java el método llamado será el que mejor se ajuste al tipo de tiempo de ejecución del argumento. En C++ parece coincidir con el tipo de referencia de tiempo de compilación, incluso si esa referencia puede terminar siendo una subclase que, en mi opinión, se ajusta mejor a otra función.
Hasta ahora, había dado por sentado que este tipo de ejecución coincidía. ¿Simplemente no existe en C++ o lo estoy haciendo de la manera incorrecta? ¿Debo hacer algo diferente en C++ para lograrlo?
Gracias,
Gary.
Gracias. No he usado ese patrón antes. Supongo que podría no ser muy común en Java. He hecho algunas pruebas y creo que probablemente recurriré a la solución 'dynamic_cast'. Esperaba algo más elegante, pero el patrón de doble despacho/visitante parece introducir todo tipo de dependencias y estrecha vinculación que no me entusiasman demasiado. –