Ответ очень похож на тот, который дан для «Почему я не могу назначить вектор для вектора ?» в FAQ Бьярна Страуструпа.
Возможность изменить тип возвращаемого значения может привести к пробелу в безопасности типов языка (см. Ответ от @GManNickG для конкретного примера) при работе с полиморфными типами.
Существует одна довольно распространенная ситуация, когда воздействие на возвращаемый тип будет идеальным: при возврате полиморфного указателя из виртуального метода базового типа. Например,
class Base {
public:
virtual Base* parent() = 0;
};
class Child : public Base {
public:
Base* parent() override
{
return parent_;
}
private:
Parent* parent_; // Assume `Parent` type exists.
};
Здесь мы потеряли информацию о типе, которую Child
знает о своем parent_
члене. Это приводит к большому количеству приведений, хотя тип в определенный момент был четко определен. Мы можем решить эту проблему с помощью идиомы (CRTP),
template<class ParentType>
class Base {
public:
virtual ParentType* parent()
{
return parent_;
}
private:
ParentType* parent_;
};
class Child : public Base<Parent> {
};