C++ typeid.name返回派生类类型之前的数字

C++ typeid.name返回派生类类型之前的数字,c++,polymorphism,typeid,C++,Polymorphism,Typeid,我有这些类:(类问题是抽象的,其他的是派生的) 我有一个向量,它存储多个问题类型。在GUI中,我需要知道我必须显示什么类型的问题,因此我使用string questionType=typeid(*question).name()而不是“QSingleChoice”、“QMultipleChoice”等。它返回“13QSingleChoice”、“5QText”、“9QOrdering”等。这些数字是什么?我可以假设它们总是一样的吗?或者,当我在不同的计算机上运行程序时,typeid可能会返回类似

我有这些类:(类问题是抽象的,其他的是派生的)


我有一个
向量
,它存储多个问题类型。在GUI中,我需要知道我必须显示什么类型的问题,因此我使用
string questionType=typeid(*question).name()
而不是“QSingleChoice”、“QMultipleChoice”等。它返回“13QSingleChoice”、“5QText”、“9QOrdering”等。这些数字是什么?我可以假设它们总是一样的吗?或者,当我在不同的计算机上运行程序时,typeid可能会返回类似“19QSingleChoice”或完全不同的东西,如“ASDQSingleChoice”

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;
  }
};
或者,您可以创建并返回枚举,而不是字符串名称


但是,首先要确保你确实需要它。通常,需要检查和识别隐藏在抽象接口后面的特定类型表明设计不好。如果GUI是程序不可分割的一部分,那么
Question
可能只提供虚拟功能,例如
virtualvoiddisplay()const。或者,如果GUI在很大程度上是问题外部的,那么使用可能更合适。

谢谢。我将创建虚拟类来获取问题类型,而不是虚拟显示函数,因为我希望GUI保持一定的分离。访客模式是我将来会研究的,作业明天就要交了。@skluzada我对答案进行了一些扩展,以展示我如何想象它的实现。
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;
  }
};