Мне много раз говорили (и видели на практике), что использование 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 оправдано?