Если вы используете приведение в стиле C ++, то вы сразу увидите проблему:
(static_cast<A*>(b))->foo(); //compile-time error
(dynamic_cast<A*>(b))->foo(); //runtime error
Демонстрация: http://ideone.com/LZjrx (ошибка времени компиляции)
Демонстрация: http://ideone.com/ePIfO (ошибка времени выполнения)
Поскольку static_cast
выдает ошибку компиляции, история заканчивается прямо во время компиляции. Когда dynamic_cast
, тогда приведение возвращает null, для которого вы пытаетесь вызвать foo
, поэтому вы получаете ошибку времени выполнения.
Даже если вы не знаете, какие приведения использовать, эти две приведения дают достаточно уверенности, чтобы сомневаться в коде, в то время как использование reinterpret_cast
настолько редко, что я даже не рассматриваю здесь.