What are benefits of using these operators instead of implicit casting in c++?
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
Why, where, in which situation we should use them? And is it true that they are rarely used in OOP?
From the list of casts you provided, the only one that makes sense to be used to supstitute an implicit cast is the static_cast.
dynamic_cast is used to downcast a superclass into its subclass. This cannot happen implicitly and is actually something that is not that rare in OOP. static_cast could be used in such a cast too, it is however more dangerous, as it does not check during run time that the downcast is valid.
The last cast, reinterpret_cast, should be used very carefully as it is the most dangerous of all. You can essentially cast anything into anything with that – but you as the programmer will have to make sure that such cast makes sense semantically, as you essentially turn off type checking by doing such cast.