Possible Duplicate:
Undefined symbols “vtable for …” and “typeinfo for…”?
C++ Undefined Reference to vtable and inheritance
I’ve a problem with a little project required from my university.
It’s a simple project of a chess game.
I’ve the obscure error undefined reference to `vtable for XXX
when I define an inherited class from an abstract one…
This is the code
Pieces.h
class Pieces {
public:
Pieces(char color) : pieceColor(color) {}
virtual ~Pieces() {}
virtual char getPieceType() = 0;
char getColor() {
return pieceColor;
}
virtual bool isLegalMove(int srcRow, int srcCol, int destRow, int destCol, Pieces* board[8][8]) = 0;
private:
virtual bool areSquaresLegal(int srcRow, int srcCol, int destRow, int destCol, Pieces* board[8][8]) = 0;
char pieceColor;
};
and this a sample inherited class i.e. the pawn one
Pawn.h
#include "Pieces.h"
class Pawn: public Pieces {
public:
Pawn(char color) : Pieces(color) {}
~Pawn();
private:
virtual char getPieceType() {
return 'P';
}
bool areSquaresLegal(int srcRow, int srcCol, int destRow, int destCol, Pieces* board[8][8]);
bool isLegalMove(int srcRow, int srcCol, int destRow, int destCol, Pieces* board[8][8]);
};
The last two methods are implemented in a .cpp file.
Every other class is similar to the pawn one obviously.
When I try to compile, the builder gives me: undefined reference tovtable for Pawn’`
with reference to the line where the constructor is:
Pawn(char color) : Pieces(color) {}
Where am I going wrong?
You say you’ve implemented the last two member functions. My guess is that you haven’t implemented the destructor that you’ve declared, but not defined in the class.
If you need a non-trivial destructor for the class, then make sure you implement it. If not, then remove its declaration.
In general, this error means that you’ve declared a non-pure virtual function and forgotten to implement it; some popular compilers place the class’s polymorphic metadata in the same translation unit as the first non-pure, non-inline member function, which in this case is the destructor. If you see the error for a class that’s supposed to be abstract, then it typically means that you’ve forgotten to declare some of its virtual functions pure.