错误 LNK2019 - 抽象类中的虚析构函数

3

可能重复:
C++中的纯虚析构函数

我有两个类:抽象的“Game”类和派生的“TestGame”类。 TestGame中的所有函数都是单独实现的(为了让它编译)。 我只得到一个错误:

TestGame.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall Game::~Game(void)" (??1Game@@UAE@XZ) referenced in function "public: virtual __thiscall TestGame::~TestGame(void)" (??1TestGame@@UAE@XZ)

这是我的类定义:

class Game
{
public:
    virtual ~Game(void) = 0;

    virtual bool Initialize() = 0;
    virtual bool LoadContent() = 0;
    virtual void Update() = 0;
    virtual void Draw() = 0;
};

class TestGame: public Game
{
public:
    TestGame(void);
    virtual ~TestGame(void);

    virtual bool Initialize();
    virtual bool LoadContent();
    virtual void Update();
    virtual void Draw();
};

我尝试了几件事情,但是感觉可能我对于抽象类和派生类的工作原理有一些基本的东西不太清楚。


请注意,派生类中的 virtual 关键字是可选的,这与标准有关。也许它们是助记符,这没问题。 - Sandburg
1个回答

12

即使是纯虚基类,你仍然需要定义它的析构函数,因为在销毁派生类时会调用它。

virtual ~Game() { /* Empty implementation */ }

对于纯虚函数来说,= 0并不是必需的,因为你可以通过其他的纯虚函数使你的类成为抽象类。


我猜你是指“析构函数”。 - Edward Strange
1
如果您提供了空实现,那么您就不需要=0(虽然这并不违法,但对大多数人来说可能会有点困惑)。 - Martin York
@Martin York:如果它是唯一的纯虚方法,你需要=0,以确保该类是抽象的,防止实例化。 - Yttrill
1
首先,去掉那个"void",C++不需要它。其次,你不能在同一个地方同时有纯虚函数的声明(=0)和定义。你必须在类外提供定义(内联或非内联-由你决定): Game::~Game() {} - Gene Bushuyev
谢谢大家。我在实现中使用了~Game(){},它运行良好。 - ptpaterson
显示剩余2条评论

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