Builder error from abstract class undefined reference to `vtable for [duplicate]
Asked Answered
S

1

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?

Saccharide answered 14/9, 2012 at 11:23 Comment(3)
Make sure you provide definitions for all virtual methods in your derived class.Only pure virtual methods are allowed to exist without an definition.Tuition
And destructor of Pawn is implemented or not?Neologism
ty @Neologism that was enlightening XDSaccharide
C
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.

Cryptoclastic answered 14/9, 2012 at 11:29 Comment(2)
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 questionSaccharide
"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. ThanksLoyalist

© 2022 - 2024 — McMap. All rights reserved.