C++ Ошибка при использовании виртуального деструктора

Я реализовал интерфейс:

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 создавать проблемы?

PS: строка, где находится ошибка, находится в определении конструктора.

3 ответа

Решение

Проблема в

virtual ~ISolution() = 0;

деструктор не реализован. Пытаться

virtual ~ISolution() { }

вместо.

Это необходимо, даже когда создаются только экземпляры производного класса, потому что деструкторы являются специальными. В нормальной функции реализация базового класса должна вызываться явно, например:

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

но для деструктора это всегда делается автоматически.

Согласно стандарту C++

9 Деструктор может быть объявлен виртуальным (10.3) или чисто виртуальным (10.4); если какие-либо объекты этого класса или любого производного класса созданы в программе, деструктор должен быть определен.

Таким образом, вы должны определить деструктор базового класса, потому что он вызывается из деструктора производного класса.

Чистый virtual деструктор все еще нуждается в реализации базового класса. По крайней мере, в этом случае, потому что без этого вы не сможете delete предмет.

Хотя это и не интуитивно понятно, это довольно распространенная парадигма при реализации полиморфных базовых классов.

Возможно, в каком-то файле isolutiuon.cpp, воплощать в жизнь:

ISolution::~ISolution()
{
}
Другие вопросы по тегам