Равны ли ссылки и указатели в отношении полиморфизма?

Я всегда думаю о необходимости использовать указатели для полиморфизма. Используя канонический пример:

DrawEngine::render(Shape *shape)
{
    shape->draw();
    shape->visible(true);
}

И передавая указатель на различные производные классы Shape. То же самое работает со ссылками?

DrawEngine::render(Shape &shape)
{
     shape.draw();
     shape.visible(true);
}

Можно ли вообще делать:

engine.render(myTriangle); // myTriangle instance of class derived from Shape

Если это работает, есть ли какие-нибудь различия между этими двумя случаями? Я пытался найти информацию в Страуструпе, но ничего не нашел.

Я снова открыл это, потому что хотел изучить еще немного.

Так что по крайней мере одно отличие - dynamic_cast. Для меня полиморфизм включает использование dynamic_cast.

Могу я пойти

Rhomboid & r = dynamic_cast<Rhomboid &>(shape);

Что произойдет, если приведение не удастся? Это что-то другое?

Rhomboid * r = dynamic_cast<Rhomboid*>(&shape);
41
задан pm100 13 July 2016 в 22:07
поделиться