从抽象类中构建错误:undefined reference to `vtable for的问题

6
可能重复:

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

我在大学的一个小项目中遇到了问题。 这是一个简单的国际象棋游戏项目。

当我从抽象类中定义继承类时,出现了“未定义对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)。

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 tovtable for Pawn'`,并且指向构造函数所在的行。
Pawn(char color) : Pieces(color) {}

我错在哪里了?

1
请确保在派生类中为所有虚方法提供定义。只有纯虚方法可以存在而没有定义。 - Alok Save
2
Pawn的析构函数是否已经实现? - Pie_Jesu
谢谢@Pie_Jesu,那真是启发性的 XD。 - Fed03
1个回答

8
你说你已经实现了最后两个成员函数。我猜测你没有实现你在类中声明但未定义的析构函数。
如果你需要一个复杂的析构函数,那么请确保你实现了它。如果不需要,则将其声明删除。
一般来说,这个错误意味着你声明了一个非纯虚函数却忘记实现它;一些流行的编译器将类的多态元数据放在与第一个非纯、非内联成员函数相同的翻译单元中,而在这种情况下是析构函数。如果你看到一个抽象类的错误,那么通常意味着你忘记声明一些虚函数为纯虚函数。

谢谢Mike,我只考虑了基本析构函数的实现...没有考虑继承的析构函数...我把它们去掉了,因为它们没有用。对于我的初学者问题感到抱歉。 - Fed03
一般而言,此错误意味着您已声明了一个非纯虚函数并忘记实现它。这对我来说很关键。谢谢。 - clapas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接