In my header for the Tile class, I defined a pure virtual method with no definition in the implementation: virtual void setVals(int ID) = 0;
The two classes which inherit Tile (Terrain and Actor) both overwrite the setVals method with the implementations:
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;
}
}
and
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;
}
}
respectively. An 2D array of each of these child classes is initialized in the Map class:
Terrain terrain_[HEIGHT][WIDTH];
Actor actors_[HEIGHT][WIDTH];
(where HEIGHT and WIDTH are constant ints). But when the program runs, the program returns a runtime error reading "'vtable for Actor', referenced from:". Am I making a mistake in how I'm initializing these methods or objects?
You said that your base class is
Tile, and has the following pure virtual methodBut yet you went on to define it?
You need to implement
Actor::setValsif that is a derived class fromTile