Просто разыграй.
Когда нужен специальный метод foo, обычно вы знаете, что
Base*
на самом деле ConcreteFoo
. Так что просто убедитесь, что определение класса
ConcreteFoo
доступно и:
ConcreteFoo* foo2 = dynamic_cast<ConcreteFoo*>(foo);
Одна из причин, по которой мне не нравится это решение, это то, что dynamic_casts работают медленно и
требуется RTTI.
Следующим шагом будет избегать dynamic_cast.
ConcreteFoo* foo_cast( Base* d )
{
if( d->id() == the_foo_id )
{
return static_cast<ConcreteFoo*>(d);
}
throw std::runtime_error("you're screwed");
}
Для этого требуется еще один метод в базовом классе, который полностью
приемлемо, но требует, чтобы идентификатор был управляемым. Это становится трудным
когда пользователи могут зарегистрировать своих собственных строителей в динамической фабрике.
Я не слишком люблю любые решения для литья, так как это требует
пользовательские классы, которые будут определены, где используются специализированные методы.
Но, может быть, я просто нацистский прицел.