Ответ 1
Что касается полиморфизма, ссылки работают так же, как указатели.
Я всегда думаю, что нужно использовать указатели для полиморфизма. Используя канонический пример:
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);
Что касается полиморфизма, ссылки работают так же, как указатели.
Относительно dynamic_cast
неудавшееся литье создает нулевой указатель с указателями и приводит к выбросу исключения bad_cast
(IIRC) со ссылками.
Одна из причин заключается в том, что нет такой вещи, как действительная нуль-ссылка.
И, возможно, другая причина (но это может быть просто непреднамеренно полезная возможность появления) заключается в том, что иногда нужно исключение, а иногда требуется простой для проверки nullpointer, и независимо от того, есть ли у вас ссылка или указатель под рукой для получения желаемого поведения требуется не более оператора разыменования или адреса.
Приветствия и hth.,
Указатели помогают другим способом. Как передать строку и принять ее как параметр 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--;
}
}
Написание кода для строковых манипуляций, подобных этим с использованием ссылок, не будет таким простым.