Generally I have seen these type of casts appear in code when something doesn't build any more, possibly because we have started using a new compiler which is more strict about implicit conversions, so that's the key 'benefit' over implicit conversions. Obviously the correct thing to do in such a situation is to change the code in some other way!
Dynamic_cast can be used for casting 'upstream' with polymorphism.  So if you have a structure like this;
Base -> Derived A
Base -> Derived B
you could do dynamic_cast(b);   (b is a pointer to Base, but is actually a Derived_B) ;
If it wasn't a Derived_B class you will get a 0 returned instead of the converted pointer.
This is much slower than the static_cast as the checking is done at runtime, rather than compile time, but the intended use is different.
reinterpret_cast just changes the type label, enabling funky C-style FX (or 'type-punning' is its normally called), useful for protocol/ low level work, but should be used sparingly. 
Generally lots of casts in code is an indication something is wrong with your code design.