У меня есть список, определенный как:
std::list<CExcited*> mExcitedList;
Возбуждение определяется как:
class CExcited
{
public:
CExcited::CExcited(){}
virtual int getAnswer() = 0;
};
У меня есть производный класс:
class CExcitedA :: public CExcited
{
public:
CExcitedA::CExcitedA(){}
int getAnswer() {return 1;}
};
И другой:
class CExcitedB :: public CExcited
{
public:
CExcitedB::CExcitedB(){}
int getAnswer() {return 2;}
};
Я добавляю некоторые элементы в список
CExcitedA* excitedA = new ExcitedA();
mExcitedList.add_back(excitedA);
CExcitedB* excitedB = new ExcitedB();
mExcitedList.add_back(excitedB);
и когда я повторяю список, я не могу понять, как узнать во время выполнения, какой класс я добавил.
Я пытался безрезультатно
for (std::list<Excited*>::iterator iter = mExcitedList.begin(); iter != mExcitedList.end(); iter++)
{
if (typeid(*iter) == typeid(CExcitedA*))
{
}
if (typeid(dynamic_cast<CExcitedA*>(*iter)) == typeid(CExcitedA*))
{
}
}
Кажется, что это должно быть прямолинейно, но я не могу этого понять.
Отредактировано Отсюда с ответом
CExcitedA* testA = dynamic_cast<CExcitedA*> (*iter);
if (testA != 0)
{
std::cout << "ES: " << dynamic_cast<CExcitedA*> (*iter)->getAnswer() << std::endl;
}
CExcitedB* testB = dynamic_cast<CExcitedB*> (*iter);
if (testB != 0)
{
std::cout << "EB: " << dynamic_cast<CExcitedB*> (*iter)->getAnswer() << std::endl;
}