Siempre pienso en tener que usar punteros para el polimorfismo. Usando el ejemplo canónico:¿Las referencias y punteros son iguales con respecto al polimorfismo?
DrawEngine::render(Shape *shape)
{
shape->draw();
shape->visible(true);
}
Y pasando en puntero a varias clases derivadas de Shape. ¿Funciona igual con referencias?
DrawEngine::render(Shape &shape)
{
shape.draw();
shape.visible(true);
}
siquiera es válida para hacerlo:
engine.render(myTriangle); // myTriangle instance of class derived from Shape
Si esto funciona, ¿hay alguna diferencia entre los dos casos? Traté de encontrar información en Stroustrup, pero no encontré nada.
Volví a abrir esto porque quería explorar un poco más.
De modo que al menos una diferencia es dynamic_cast. Para mí, el polimorfismo incluye el uso de dynamic_cast.
¿Puedo ir
Rhomboid & r = dynamic_cast<Rhomboid &>(shape);
¿Qué ocurre si falla el elenco? ¿Esto es diferente?
Rhomboid * r = dynamic_cast<Rhomboid*>(&shape);
@ PM100:. Directamente, sin duda, pero hay diferentes facetas. Por ejemplo, 'dynamic_cast' lanzará una excepción en lugar de devolver null en un mal lanzamiento. – GManNickG
@GMan: Pienso en el ejemplo 'dynamic_cast' como diferencia básica entre punteros y referencias: los punteros pueden ser legalmente NULL, mientras que las referencias no. El corazón de la pregunta, mientras lo leo, es si las referencias se comportan igual con respecto a las tablas virtuales. De ahí la breve respuesta. –
De la forma en que lo veo, las referencias parecen ser poco más que azúcar sintáctico sobre punteros. –