Ok, you have found out, that a Cat can be treated as an Animal object. That's called up-casting and that is done automatically by the compiler, as it is not dangerous.
The other direction requires some special knowledge. You have an Animal pointer and you "know" that the underlying object is a Cat object. You can in this instance perform a down-cast like this:
Cat* pCat = dynamic_cast<Cat*> (pAnimal);
The dynamic cast operator will deliver a NULL pointer, in case pAnimal does not point to a Cat. Note that this requires RTTI (runtime type information) to be enabled in your compiler.
You also could do a plain old cast
Cat* pCat = (Cat*) pAnimal;
which is however relatively dangerous, as you do not get a warning sign in case pAnimal does not point to a Cat. Not the recommended way to do it!