据说,链接器指的是对vtable的未定义引用

Dev*_*ore 2 abstract-class vtable c++11

我试图使用抽象类来表示子类型的公共基础.但是,无论我做什么,它(看起来像是链接器)都会对vtable和未定义的引用保持呻吟.根据错误消息判断,问题必须以某种方式与析构函数相关.Wierdldy足够,它一直在谈论一个

"未定义引用'AbstractBase :: ~AbstractBase()'"

在child.cpp中没有任何意义.

就像上次一样,我实际上无法显示我的代码,所以这里有一个实际上做同样事情的例子:

首先是抽象类"AbstractBase.h":

#ifndef ABSTRACTBASE
#define ABSTRACTBASE

class AbstractBase
{
   public:
   virtual ~AbstractBase() = 0;
}
#endif
Run Code Online (Sandbox Code Playgroud)

使用abstractbase的子节点"child.h":

#ifndef CHILD
#define CHILD

class child : public AbstractBase
{
   public: 
      ~child() override;
}
#endif
Run Code Online (Sandbox Code Playgroud)

"child.cpp"中的实现:

#include "child.h"
child::~child()
Run Code Online (Sandbox Code Playgroud)

显然有更多的功能,但实质上这就是我的真正的类的析构函数的外观.

在网上搜索了在C++中使用抽象类的方法之后,我即将放弃.据我从这些消息来源可以看出,这是做到这一点的方法.您声明您的摘要类的析构函数是虚拟的,因此对它的任何调用都将包含该子项.孩子的析构函数只是标记为覆盖.它应该没有任何其他东西.

我错过了一些真正重要的东西吗?

PS:加入MCVE:

class AbstractBase
{
   public:
   virtual ~AbstractBase() = 0;
};

class child : public AbstractBase
{
    public:
    void dostuff()
    {
      //stuff
    }

    ~child() override
    {}
}

int main (argc, char *argv[])
{
   child* ptr = new child();
   ptr->dostuff();
}
Run Code Online (Sandbox Code Playgroud)

我应该补充一点,我现在得到的错误并不完全相同,而原始错误看起来像这样:

未定义引用'vtable for AbstractBase':在函数AbstractBase中:~AbstractBase()':未定义引用'vtable for AbstractBase':未定义引用'typeinfo for AbstractBase':Collect2:error:ld返回1退出状态

Ker*_* SB 6

您需要为每个类定义析构函数,否则您不能销毁该类的对象(包括成员对象和基础子对象):

class AbstractBase
{
public:
   virtual ~AbstractBase() = default;
}; //                     ^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

一些替代配方: