错误 LNK2019 - 抽象类中的虚拟析构函数 [重复]

Posted

技术标签:

【中文标题】错误 LNK2019 - 抽象类中的虚拟析构函数 [重复]【英文标题】:error LNK2019 - Virtual destructor in abstract class [duplicate] 【发布时间】:2011-05-21 18:37:36 【问题描述】:

可能重复:Pure virtual destructor in C++

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

TestGame.obj:错误 LNK2019: 未解析的外部符号“公共: 虚拟 __thiscall Game::~Game(void)" (??1Game@@UAE@XZ) 中引用 功能“公共:虚拟__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 关键字对于标准而言是可选的。也许他们是助记符,没关系。 【参考方案1】:

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

virtual ~Game()  /* Empty implementation */ 

纯虚函数的= 0 不是必需的,因为您还有其他纯虚函数可以使您的类抽象。

【讨论】:

我假设你的意思是“析构函数”。 如果您还提供了空实现,则不需要 =0(尽管它不是非法的,只是对大多数人来说有点混乱)。 @Martin York:如果它是唯一的纯虚方法,则需要 =0,以确保类是抽象的,以防止实例化。 首先,去掉那个“void”,C++ 不需要它。其次,你不能在同一个地方有纯虚拟声明(=0)和定义。您必须在类之外提供定义(内联或非内联 - 您的选择):Game::~Game() 谢谢大家。我 ~Game() 在实现中,它工作正常。

以上是关于错误 LNK2019 - 抽象类中的虚拟析构函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ Dll 的 LNK2019 构造函数/析构函数

LNK2019构造函数/析构函数使用C ++ Dll

LNK2019“未解析的外部符号”错误(C++ OpenGL)

无故定义多个析构函数

为啥我们需要 C++ 中的纯虚析构函数?

如何解决此链接错误