Каков правильный вариант использования dynamic_cast?

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

17
задан 25 April 2011 в 08:53
поделиться