I\'m having a devil of a time understanding references. Consider the following code:
class Animal
{
public:
    virtual void makeSound() {cout << \"rawr\"         
        
(I'm ignoring your problems with dynamic memory going into references causing memory leaks... )
Your splitting problems go away when Animal is an abstract base class. That means it has at least one pure virtual method and cannot be directly instantiated. The following becomes a compiler error:
Animal a = rFunc();   // a cannot be directly instantiated
                      // spliting prevented by compiler!
but the compiler allows:
Animal* a = pFunc();  // polymorphism maintained!
Animal& a = rFunc();  // polymorphism maintained!
Thus the compiler saves the day!