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

C++ C++;使用虚拟析构函数时出错,c++,virtual-destructor,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() {} vo

我实现了一个接口:

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
是否造成问题

注意:错误所在的行在构造函数的定义中。

问题是

virtual ~ISolution() = 0;
析构函数未实现。 试一试

相反

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

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

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

虚拟的
析构函数仍然需要基类实现。至少在这种情况下是这样的,因为没有它,您就无法
删除对象

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

在某些文件中,可能是
isolution.cpp
,实现:

ISolution::~ISolution()
{
}

根据C++标准

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


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

不能有抽象析构函数。如果你有一个虚拟析构函数,它会被调用,如果它是抽象的(没有实现),它怎么能被调用呢?CMake不是一个编译器,它是一个构建系统。由于您使用的是Linux,所以您使用的编译器可能是g++。我知道CMake不是编译器,很抱歉,它的公式不正确sentence@JohnDibling可以说,CMake也不是一个构建系统,而是一个构建系统生成器。:)
ISolution::~ISolution()
{
}