Изучение C ++: возврат ссылок И переход нарезка

Я чертовски разбираюсь в ссылках. Рассмотрим следующий код:

class Animal
{
public:
    virtual void makeSound() {cout << "rawr" << endl;}
};

class Dog : public Animal
{
public:
    virtual void makeSound() {cout << "bark" << endl;}
};

Animal* pFunc()
{
    return new Dog();
}

Animal& rFunc()
{
    return *(new Dog());
}

Animal vFunc()
{
    return Dog();
}

int main()
{
    Animal* p = pFunc();
    p->makeSound();

    Animal& r1 = rFunc();
    r1.makeSound();

    Animal r2 = rFunc();
    r2.makeSound();

    Animal v = vFunc();
    v.makeSound();
}

И результат: "bark bark rawr rawr".

С точки зрения Java (который, по-видимому, исказил мое представление о C ++), результатом будет «кора, кора, кора, кора». Из моего предыдущего вопроса я понял, что эта разница связана с нарезкой, и теперь я хорошо понимаю, что такое нарезка.

Но допустим, мне нужна функция, которая возвращает значение Animal, которое на самом деле является Dog.

  1. Правильно ли я понимаю, что ближе всего я могу найти ссылку ?
  2. Кроме того, должен ли тот, кто использует интерфейс rFunc, убедиться, что возвращенной ссылке назначено Animal & ? (Или иначе намеренно назначить ссылку на Animal, которое путем нарезки отбрасывает полиморфизм.)
  3. Как я должен возвращать ссылку на только что сгенерированный объект, не совершая глупостей, которые я сделал выше в rFunc? (По крайней мере, я слышал, что это глупо.)

Обновление: поскольку все, похоже, до сих пор согласны с тем, что rFunc является незаконным, возникает еще один связанный с этим вопрос:

Если я верну указатель, как мне связаться с программисту, что указатель не их, удалить, если это так? Или, в качестве альтернативы, как мне сообщить, что указатель может быть удален в любое время (из того же потока, но из другой функции), чтобы вызывающая функция не сохраняла его, если это так. Это единственный способ сообщить об этом через комментарии? Это кажется небрежным.

Примечание: Все это привело к идее шаблонной концепции shared_pimpl, над которой я работал. Надеюсь, я узнаю достаточно, чтобы опубликовать что-нибудь об этом за пару дней.

11
задан Community 23 May 2017 в 12:26
поделиться