Другие отмечают, что переключение типов обычно плохая идея, поэтому я не буду.Если вам действительно нужно это сделать, вы можете использовать оператор typeid
для включения динамического типа объекта:
ClassA* SomeClass::doSomething ( ClassA* a )
{
if (typeid(*a) == typeid(ClassA)) {
/* parameter is of type base class */
} else if (typeid(*a) == typeid(ClassB)) {
/* a specific derived class */
} else {
/* some other derived class */
}
}
dynamic_cast
аналогично, но проверяет на конвертируемость, а не равенство:
ClassA* SomeClass::doSomething ( ClassA* a )
{
if (ClassB *b = dynamic_cast<classB*>(a)) {
/* parameter is, or is derived from, ClassB */
} else {
/* parameter is, or is derived from, ClassA but not ClassB */
}
}
Они работают, только если ClassA
полиморфен (то есть имеет хотя бы одну виртуальную функцию).