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()
{
}