所以我必须为一个项目制作一个基于文本的视频游戏。我创建了一个名为“tile”的类,然后创建了一个名为“wall”的子类。然后,我制作了如下所示的图块阵列。中心图块B2是一堵墙。当我比较typeid(B2)==typeid(wall)时,即使图块B2的类型为wall,它也会返回false。类“战斗机”具有x和y分量。

  //Initiate map
    const int rows = 3;
    const int cols = 3;
    tile A1, A2, A3, B1, B3, C1, C2, C3;
    fighter wizard(1, 2, 6, ft::mage, 100);
    C3 = tile(wizard, "There's all this magic stuff everywhere.");
    wall B2= wall("A wall blocks your path.");
    tile map[rows][cols] =  {{A1, A2, A3},
                             {B1, B2, B3},
                             {C1, C2, C3}};
...

fighter player1(0, 0, 0, ft::warrior);

...

string input = "";
while(input!="quit")
{
    cin >> input;
    if (input == "left") {
        if (typeid(map[player1.y][player1.x - 1]) == typeid(wall))
            cout << map[player1.y][player1.x - 1].scene;

最佳答案

tile map[rows][cols]

存储图块对象。如果要检查这些对象,则会发现它们属于tile类。不是原始B2对象的类型wall。所以
if (typeid(map[player1.y][player1.x - 1]) == typeid(wall))

将始终比较tile == wall

如果您对保留动态类型感兴趣,则需要使用(智能)指针或引用原始对象的任何方式。这些对象需要具有动态类型/具有虚拟功能。

另请参阅What is dynamic type of object

关于c++ - 为什么typeid总是返回false?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36562169/

10-10 15:01