Существует базовый класс A, который является виртуальным.
class A
{
~virtual A() = 0;
};
и более производные классы B, C, D, E...
class B : public A
{
};
class C: public A
{
};
и аналогично для других классов D, E... У нас есть список указателей A
std::list <A*> a_list;
Мы удаляем любой элемент, тип которого неизвестен, например
A *a = a_list.front();
Основываясь на типе остроконечного объекта, мы решаем, что делать... Есть больше возможностей, как это сделать:
A) случай dynamic_cast
Преобразование a в производные типы.
if (dynamic_cast <B*> (a))
{
//do something (but nothing with a)
}
else if (dynamic_cast <C*> (a))
{
//do other (but nothing with a)
}
Но использование dynamic_cast указывает на плохой дизайн.
Б) Дополнительный атрибут
Реализован некоторый дополнительный атрибут, например идентификатор объекта;
class A
{
virtual ~A() = 0;
virtual short getID() = 0;
};
class B : public A
{
virtual short getID() {return 1;}
};
class C: public A
{
virtual short getID() {return 2;}
};
Таким образом, модифицированное условие
switch ( a->getID())
{
case 1: // do something (but nothing with a)
case 2: // do other (but nothing with a)
}
Примечание:
Мы не выполняем никаких действий непосредственно с объектом, а на основе его типа делаем какие-то другие вычисления.
Вопросы:
1) Это тот случай, когда нам следует избегать dynamic_cast?
2) есть ли предпочтительное решение (может отличаться от представленного)?
Спасибо за вашу помощь.