У меня есть 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, но он должен иметь возможность t o использовать следующий превосходный класс (в данном случае это Special
).
Как бы кто-то реализовал такую вещь? Существует ли шаблон проектирования, который позволяет создать иерархический порядок классов, а следующий доступный суперкласс будет использоваться в качестве резерва, если текущий класс не может быть использован (потому что он неизвестен)?
ПРИМЕЧАНИЕ. Идентификаторы типов предназначены только для демонстрационных целей. Разумеется, есть более эффективные методы для определения класса в C++ (RTTI).
Хорошее осуществление, но в чем проблема? Почему вы используете if-else-if вместо того, чтобы просто вводить реальный код в этот виртуальный метод? – sharptooth
Разве вы уже этого не делаете? I.e. если тип неизвестен, вы возвращаетесь к специальному – Cratylus
@userxxx: Там может быть много классов, которые неизвестны. Возможно, пользователь наследует от 'super', затем следующий наследует от другого userclass и т. Д. Также могут быть серверные методы' handleClasses', которые частично понимают пользовательские классы и т. Д. – MOnsDaR