В этом случае сохранение вектора Animal
не будет работать для вас, поскольку ваши животные имеют разные размеры, и вы не сможете хранить производные объекты в пространствах, предназначенных для хранения базового класса. (И даже если они имеют одинаковый размер, вы не получите желаемого полиморфного эффекта, так как будут выполняться методы базового класса - виртуальность метода не вступит в игру, если вы не получите к нему доступ через указатель или ссылку. )
Если вы хотите избежать раздражения, связанного с управлением памятью самостоятельно, вы можете хранить смарт-указатель, такой как shared_ptr (обратите внимание, что auto_ptr не работает с контейнерами STL по словам Макса Либберта) или какой-то его вариант. Таким образом, вы все еще можете использовать свой полиморфный класс, но для вас это немного меньше.
Нет никаких действительно жестких и быстрых правил относительно того, когда использовать объекты и указатели, хотя стоит отметить, что в некоторых случаях, как и у вас, объекты просто не будут работать для вас. Я склонен использовать объекты всякий раз, когда ничто не мешает этому, хотя, как вы заметили, вы должны быть обеспокоены дорогостоящими операциями копирования (хотя иногда их можно улучшить, передавая контейнеры по ссылке).