6

可能重复:
未定义的符号“vtable for ...”和“typeinfo for ...”?
C++ 未定义对 vtable 和继承的引用

我对大学要求的一个小项目有疑问。这是一个国际象棋游戏的简单项目。

当我从抽象类定义继承类时,我有一个模糊的错误 undefined reference to `vtable for XXX... 这是代码

碎片.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;
};

这是一个示例继承类,即典当类

典当

#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 tovtable for Pawn'` 参考构造函数所在的行:

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

我哪里错了?

4

1 回答 1

8

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

如果您需要该类的重要析构函数,请确保实现它。如果不是,则删除其声明。

一般来说,这个错误意味着你声明了一个非纯虚函数而忘记实现它;一些流行的编译器将类的多态元数据与第一个非纯非内联成员函数(在本例中为析构函数)放在同一个翻译单元中。如果你看到一个应该是抽象的类的错误,那么这通常意味着你忘记声明它的一些虚函数是纯的。

于 2012-09-14T11:29:22.203 回答