Ссылки в c ++ ведут себя (почти) как скрытые указатели.В частности, то же самое полиморфное поведение, которое вы можете получить с помощью указателя, вы можете достичь с помощью ссылки.То есть следующие (почти) эквивалентны
int *i = &a;
int &j = a;
при условии, что a было целым числом, определенным где-то в предыдущих строках.Следующие вхождения ссылки j, полностью эквивалентны вхождениям (* i).Основное отличие состоит в том, что ссылка не дает вам проблем с управлением памятью, в то время как указатель делает это (вы несете ответственность за обработку новых и удаленных файлов).Кроме того, указатель не должен указывать на что-то, в то время как ссылка не может существовать, если она ни на что не ссылается.Кроме этого, вы можете считать, что они ведут себя одинаково.
Следовательно, абсолютно законно иметь ссылку на абстрактный объект.Это часто встречается в сигнатурах функций, где полиморфное поведение может быть достигнуто с помощью ссылок или указателей.Но ссылки дают более легкий синтаксис, как показано в следующем фрагменте кода
A a;
A* ptr = &a;
A& ref = a;
ref();
ptr->operator()();
(*ptr)();
при условии перегрузки класса A operator ()
.