抽象类的虚析构函数是模糊的

Virtual destructor of abstract class fix is fuzzy

本文关键字:模糊 抽象类 析构函数      更新时间:2023-10-16

我有一个抽象类,当我试图删除该类的实例时,我得到一些错误。

class CCobjectBase
{
public:
    CCobjectBase();
    virtual ~CCobjectBase();
    virtual void createPainterPath() = 0;
};
class CTriangle : public CCobjectBase
{
public:
    CTriangle();
    ~CTriangle();
    void createPainterPath();
  };
CCobjectBase :: ~CCobjectBase(){}

我创建的对象如下:

std::vector<CCobjectBase *> m_objectBaseList;
m_objectBaseList.push_back(new CTriangle());
//do stuff with m_objectBaseList
delete m_objectBaseList.at(index);
m_objectBaseList.erase(m_objectBaseList.begin() + index);

我在~CTriangle()检索到一个错误"对CCobjectBase的未定义引用::~CCobjectBase()"。如果我从CCobjectBase中删除虚拟析构函数,我会得到警告"删除具有非虚拟析构函数的抽象类类型CCobjectBase的对象将导致未定义行为",这真的很烦人,但修复会导致更多问题。

更新:这是一种愚蠢的,但我尝试运行qmake ->重建所有和什么都没有发生,但当我重新启动应用程序没有错误或警告显示。为什么它现在起作用了?我不知道。

你的方法

virtual ~CCobjectBase();

是未定义的。它被声明了,但是你没有提供定义。在c++ 11中,您可以将声明更改为

virtual ~CCobjectBase() = default;

当我替换以下定义时,我得到它与clang++编译:

#include <vector>
class CCobjectBase
{
public:
    CCobjectBase() {};
    virtual ~CCobjectBase() {};
    virtual void createPainterPath() = 0;
};
class CTriangle : public CCobjectBase
{
public:
    CTriangle();
    ~CTriangle();
    void createPainterPath();
};
CTriangle::CTriangle() {}
CTriangle::~CTriangle() {}
void CTriangle::createPainterPath() {}
int main() {
  std::vector<CCobjectBase *> m_objectBaseList;
  m_objectBaseList.push_back(new CTriangle());
  //do stuff with m_objectBaseList
  int index = 0;
  delete m_objectBaseList.at(index);
  m_objectBaseList.erase(m_objectBaseList.begin() + index);
}

如果不适合您,请提供更多信息