У меня есть 3 класса:
class Super
{
virtual int getType() { return 1; }
}
class Special : public class Super
{
virtual int getType() { return 2; }
}
class SpecialSpecial : public class Special
{
virtual int getType() { return 3; }
}
И у меня есть функция, которая принимает std::vector<Super*>
в качестве аргумента:
void handleClasses( std::vector<Super*> superVector )
{
foreach element in superVector //Pseudocode!!
{
if( element->getType() == 1 )
std::cout << "Thats a SuperClass" << std::endl;
else if( element->getType() == 2 )
std::cout << "Thats a SpecialClass" << std::endl;
else if( element->getType() == 3 )
std::cout << "Thats a SpecialSpecialClass" << std::endl;
}
}
Может существовать пользователь, который наследует от класса Special
:
class ParalellSpecial : public class Special
{
virtual int getType() { return 4; }
}
Теперь функция handleClasses
не может понять новый класс с типом 4, но она должна иметь возможность использовать следующий улучшенный класс (в данном случае это Special
).
Как бы кто-то реализовал такую вещь? Существует ли шаблон проектирования, который позволяет создавать иерархический порядок классов, и следующий доступный суперкласс будет использоваться в качестве запасного варианта, если текущий класс не может быть использован (потому что он неизвестен)?
ПРИМЕЧАНИЕ. Идентификаторы типов предназначены только для демонстрационных целей. Конечно, есть лучшие методы для идентификации класса в C ++ (RTTI).