Мне много раз говорили (и я видел себя на практике), что использование dynamic_cast часто означает плохой дизайн, потому что его можно и нужно заменить виртуальными функциями.
Например, рассмотрим следующий код:
class Base{...};
class Derived:public Base{...};
...
Base* createSomeObject(); // Might create a Derived object
...
Base* obj = createSomeObject();
if(dynamic_cast<Derived*>(obj)){
// do stuff in one way
}
else{
// do stuff in some other way
}
Легко увидеть, что вместо записи динамических приведений мы можем просто добавить виртуальную функцию doStuff ()
в Base
и повторно реализовать его в Derived
.
В этом случае мой вопрос: почему у нас вообще есть dynamic_cast в языке? Есть ли пример, в котором оправдано использование dynamic_cast?