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退出状态
您需要为每个类定义析构函数,否则您不能销毁该类的对象(包括成员对象和基础子对象):
class AbstractBase
{
public:
virtual ~AbstractBase() = default;
}; // ^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
一些替代配方:
用户自定义:
struct AbstractBase {
virtual ~AbstractBase() {}
};
Run Code Online (Sandbox Code Playgroud)纯虚拟,但定义:
struct AbstractBase {
virtual ~AbstractBase() = 0;
};
AbstractBase::~AbstractBase() = default;
Run Code Online (Sandbox Code Playgroud)
即使您没有其他虚拟成员函数,这样也可以使类保持抽象.
结合这两个:
struct AbstractBase {
virtual ~AbstractBase() = 0;
};
AbstractBase::~AbstractBase() {}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
618 次 |
| 最近记录: |