static_cast: includes no run-time checking, so is fast and potentially dangerous.
dynamic_cast: includes run-time checking, so is slow and safe. Returns a null pointer if the cast fails.
safe_cast: same as dynamic cast, but throws an exception if the cast fails.