Подтвердить что ты не робот

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

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

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);
4b9b3361

Ответ 1

Что касается полиморфизма, ссылки работают так же, как указатели.

Ответ 2

Относительно dynamic_cast неудавшееся литье создает нулевой указатель с указателями и приводит к выбросу исключения bad_cast (IIRC) со ссылками.

Одна из причин заключается в том, что нет такой вещи, как действительная нуль-ссылка.

И, возможно, другая причина (но это может быть просто непреднамеренно полезная возможность появления) заключается в том, что иногда нужно исключение, а иногда требуется простой для проверки nullpointer, и независимо от того, есть ли у вас ссылка или указатель под рукой для получения желаемого поведения требуется не более оператора разыменования или адреса.

Приветствия и hth.,

Ответ 3

Указатели помогают другим способом. Как передать строку и принять ее как параметр char * в функции.

Рассмотрим старый пример обращения строки:

void reversestring(char* myString)
{
int firstPos=0;
int lastPos=myString.length - 1;
while (firstPos < lastPos)
{
  char temp=myString[firstPos];
  myString[firstPos]=myString[lastPos];
  myString[lastPos]=temp;
  firstPos++;
  lastPos--;
}
}

Написание кода для строковых манипуляций, подобных этим с использованием ссылок, не будет таким простым.