具有虚拟 child 方法的 objects 二维数组 -> "vtable referenced from" 错误

2D Array of objects with virtual child methods -> "vtable referenced from" error

在我的 header 中,我为 Tile class 定义了一个纯虚方法,在实现中没有定义:virtual void setVals(int ID) = 0;

继承 Tile 的两个 classes(Terrain 和 Actor)都用实现覆盖了 setVals 方法:

void Terrain::setVals(int ID){
    switch(ID){
        case 1 : GFX_ = '.'; name_ = "Grass"; desc_ = "Some grass"; break;
        default: GFX_ = '?'; name_ = "Error"; desc_ = "Error"; Tile::isPassable_ = false; break;
    }
}

void Tile::setVals(int ID){
    switch(ID){
        case 1 : GFX_ = '?'; name_ = "Nothing"; desc_ = "You shouldn't be seeing this"; break;
        case 0 : GFX_ = '@'; name_ = "Player"; desc_ = "The Player"; break;
        default: GFX_ = '?'; name_ = "Error"; desc_ = "Error"; Tile::isPassable_ = false; break;
    }
}

分别。这些 child classes 中的每一个的二维数组在 Map class:

中初始化
Terrain terrain_[HEIGHT][WIDTH];
Actor actors_[HEIGHT][WIDTH];

(其中 HEIGHT 和 WIDTH 是常量整数)。但是当程序运行时,程序returns 出现运行时错误读取“'vtable for Actor',引用自:”。我是不是在初始化这些方法或 objects 时犯了错误?

你说你的基础class是Tile,有如下纯虚方法

virtual void setVals(int ID) = 0;

但是你还继续定义它吗?

void Tile::setVals(int ID){
    switch(ID){
        case 1 : GFX_ = '?'; name_ = "Nothing"; desc_ = "You shouldn't be seeing this"; break;
        case 0 : GFX_ = '@'; name_ = "Player"; desc_ = "The Player"; break;
        default: GFX_ = '?'; name_ = "Error"; desc_ = "Error"; Tile::isPassable_ = false; break;
    }
}

如果 Actor::setValsTile

的派生 class,则需要实施 Actor::setVals