C ++使用虚拟析构函数时出错

时间:2014-05-06 12:44:34

标签: c++ virtual-destructor

我已经实现了一个界面:

class ISolution
{
public:
  virtual ~ISolution() = 0;

  virtual void resultat() = 0;
};

以及它的一些派生类:

class SolX : ISolution
{
private:
  int member;
  MyClass myOb;
public:
  SolX(const MyClass& inOb) : myOb(inOb) {}
  ~SolX() {}

  void resultat()
  {
    // the body
  }
};

当我编译它时,我得到如下错误:

/proj/CSolution1.cpp:4: undefined reference to `ISolution::~ISolution()'
/proj/CSolution2.cpp:4: undefined reference to `ISolution::~ISolution()'
CMakeFiles/proj.dir/CSolution2.cpp.o:/proj/CSolution2.cpp:12: more undefined references to `ISolution::~ISolution()' follow

我正在使用CMake和Linux Ubuntu。

我无法弄清楚问题是什么。有没有我错过的东西? myOb是否会产生问题?

P.S。:错误的行在构造函数的定义中。

3 个答案:

答案 0 :(得分:2)

问题是

virtual ~ISolution() = 0;

析构函数未实现。 尝试

virtual ~ISolution() { }

代替。

即使仅创建派生类的实例,也需要这样做,因为析构函数是特殊的。 在普通函数中,需要显式调用基类实现,如

void Derived::Foo() {
    Base::Foo();
    ....
}

但是对于析构函数,这总是自动完成。

答案 1 :(得分:2)

根据C ++标准

  

9析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);   如果在该类中创建了该类或任何派生类的任何对象   程序,应该定义析构函数。

所以你必须定义基类的析构函数,因为它是从派生类的析构函数中调用的。

答案 2 :(得分:1)

virtual析构函数仍然需要基类实现。至少在这种情况下会这样做,因为如果没有它,你就不能delete该对象。

虽然不直观,但在实现多态基类时,这是一个相当常见的范例。

在某些文件中,可能是isolutiuon.cpp,执行:

ISolution::~ISolution()
{
}