Имя, возвращаемое std::type_info::name
, определяется реализацией, что означает, что каждый компилятор должен сам решать, как он хочет представлять имена типов.Другими словами, это не то, на что вы могли бы положиться.Это полезно для отладки и может использоваться для некоторых сравнений в рамках одного и того же прогона программы, но я не считаю, что его можно использовать гораздо больше: вам нужно будет изучить документацию вашего компилятора, чтобы выяснить, предлагает ли онгарантии, которые вам нужны.
Как правило, гораздо лучше представить такую функциональность самостоятельно, если она вам нужна, возможно, в виде virtual const std::string& classId() const;
.
. Она может быть реализована следующим образом:
class Question {
public:
virtual const std::string& getClassId() const = 0;
};
class QSingleChoice : public Question {
public:
const std::string& getClassId() const override
{
static const std::string name{"SingleChoice"};
return name;
}
};
class QMultipleChoice : public Question {
public:
const std::string& getClassId() const override
{
static const std::string name{"MultipleChoice"};
return name;
}
};
В качестве альтернативы вы можете создать и вернуть перечисление вместо имени строки.
Однако сначала убедитесь, что оно вам действительно нужно.Довольно часто необходимость проверять и идентифицировать определенный тип, скрывающийся за абстрактным интерфейсом, указывает на плохой дизайн.Если графический интерфейс является неотъемлемой частью программы, возможно, Question
может просто предложить виртуальные функции, такие как virtual void display() const;
.В качестве альтернативы, если графический интерфейс в значительной степени является внешним по отношению к вопросам, возможно, более уместным будет использование шаблона посетителя .