Есть задачи, которые не имеют решения на ссылках (либо это решение в разы хуже, чем если бы мы использовали указатели).
Пример: паттерн стратегия
#include <iostream>
#include <memory>
class Strategy {
public:
virtual void doAction() = 0;
};
class FirstStrategy : public Strategy{
public:
void doAction() override {
std::cout << "First" << std::endl;
}
};
class SecondStrategy : public Strategy{
public:
void doAction() override {
std::cout << "Second" << std::endl;
}
};
class A {
std::shared_ptr<Strategy> behavior;
public:
void setBehavior(std::shared_ptr<Strategy> b) {
behavior = b;
}
void doBehavior() {
behavior->doAction();
}
};
int main() {
A a;
a.setBehavior(std::make_shared<FirstStrategy>());
a.doBehavior();
a.setBehavior(std::make_shared<SecondStrategy>());
a.doBehavior();
return 0;
}
Во время исполнения стратегия может меняться. Так как ссылку изменить нельзя, придется создавать какие-то костыли. С указателями все проще: просто обновляем значение переменной