【问题标题】:Builder error from abstract class undefined reference to `vtable for [duplicate]来自抽象类未定义引用的生成器错误对`vtable for [重复]
【发布时间】:2012-09-07 13:27:21
【问题描述】:

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

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

我有一个模糊的错误 undefined reference to `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 文件中实现。 显然,其他每个类都与 pawn 相似。

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

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

我哪里错了?

【问题讨论】:

  • 确保为派生类中的所有虚方法提供定义。只有纯虚方法才允许存在而没有定义。
  • Pawn的析构函数是否实现?
  • ty @Pie_Jesu 启发了 XD

标签: c++ virtual-functions


【解决方案1】:

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

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

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

【讨论】:

  • thx mike,我只知道基本析构函数的实现......不是继承的......我摆脱了它们,因为它们没有用。对不起我的菜鸟问题
  • “一般来说,这个错误意味着你声明了一个非纯虚函数而忘记实现它”。这对我来说是关键。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2019-11-02
  • 2015-09-24
相关资源
最近更新 更多