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

时间:2016-08-08 08:05:35

标签: c++ qt

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

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()&#34;未定义引用CCobjectBase ::〜CCobjectBase()&#34;时检索错误。如果我从CCobjectBase中删除虚拟析构函数,我会收到警告&#34;删除具有非虚析构函数的抽象类类型CCobjectBase的对象将导致未定义的行为&#34;这真的很烦人,但修复会导致更多问题。

更新 这有点愚蠢,但我试过运行qmake - &gt;重建所有,没有任何反应,但当我重新启动应用程序时,没有显示任何错误或警告。为什么现在有效?我不知道。

2 个答案:

答案 0 :(得分:3)

你的方法

virtual ~CCobjectBase();

未定义。它已声明,但您没有提供定义。 使用C ++ 11,您可以将声明更改为

virtual ~CCobjectBase() = default;

表示空的定义。

答案 1 :(得分:1)

当我替换以下定义时,我用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);
}

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