6

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?

Community
  • 1
  • 1
Fed03
  • 575
  • 5
  • 16

1 Answers1

8

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.

Mike Seymour
  • 249,747
  • 28
  • 448
  • 644
  • thx mike, i've only thougth about the implementation of the base destructor...not the inherited ones...I got rid of them since are not useful. sry for my noobish question – Fed03 Sep 14 '12 at 13:13
  • "In general, this error means that you've declared a non-pure virtual function and forgotten to implement it". That was the key for me. Thanks – clapas Sep 05 '17 at 08:48