生成器错误从抽象类未定义引用到`vtable for

时间:2012-09-14 11:23:41

标签: c++ virtual-method

  

可能重复:
  Undefined symbols “vtable for …” and “typeinfo for…”?
  C++ Undefined Reference to vtable and inheritance

我的大学需要一个小项目的问题。 这是一个国际象棋比赛的简单项目。

我有一个模糊的错误未定义引用`vtable for XXX 当我从一个抽象的类中定义一个继承的类时...... 这是代码

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;
};

这是一个样本继承类,即典当

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]);
};

最后两个方法是在.cpp文件中实现的。 其他每一个班级显然都与典当类相似。

当我尝试编译时,构建器会给我:undefined reference to vtable for Pawn'` 参考构造函数所在的行:

Pawn(char color) : Pieces(color) {}

我哪里错了?

1 个答案:

答案 0 :(得分:7)

你说你已经实现了最后两个成员函数。我的猜测是你没有实现你声明的析构函数,但没有在类中定义。

如果你需要一个非平凡的析构函数,那么请确保你实现它。如果没有,则删除其声明。

通常,此错误意味着您已声明了非纯虚函数并忘记实现它;一些流行的编译器将类的多态元数据放在与第一个非纯非内联成员函数相同的转换单元中,在这种情况下,它是析构函数。如果你看到一个应该是抽象的类的错误,那么它通常意味着你忘记了声明它的一些虚函数。