Here's the trick, if you have some classes like A,B,C,D,E, and they have a common baseclass Base, then a downcast from Base needs to choose correct class. The casting only works if the original object was created to have the same class. In the example with 5 derived classes and one Base class, there is 1:5 chance of getting it right. Which is not very good, and programmers often choose it wrong. static_cast cannot detect the problem at all and wrong choice of the type in static_cast results in crashes. dynamic_cast can detect it, but only in runtime, i.e. dynamic_cast can also fail and return NULL or throw an exception. RTTI is needed so that dynamic_cast can fail properly.