Когда вы вводите тип от Derived<int>*
до Base*
, вы теряете информацию о том, какой у вас производный класс, если вы не используете RTTI (идентификация типа RunTime).
Если вы включили RTTI, вы можете попытаться типизировать Base*
пересылку к указателю производного типа, используя dynamic_cast<>()
:
void Foo(Base* base)
{
Derived<int>* derivedInt = dynamic_cast<Derived<int>*>(base);
if(derivedInt)
{
Foo(derivedInt);
return;
}
Derived<double>* derivedDouble = dynamic_cast<Derived<double>*>(base);
if(derivedDouble)
{
Foo(derivedDouble);
return;
}
// Handle other cases here.
}
dynamic_cast
возвращает NULL, если указатель не указывает на правильный тип.
В качестве альтернативы, если вы не хотите использовать RTTI и dynamic_cast
, вам необходимо сохранить некоторые средства для определения того, какой подкласс хранится в вашем векторе (обычно значение enum
хранится вместе с указателем, возможно, в pair
, или с помощью метода в Base
, который возвращает аналогичный enum
) и использования reinterpret_cast<>()
для типизации указателя.