С++ производный класс и виртуальный деструктор

Пожалуйста, ознакомьтесь с простым кодом ниже:

#include <iostream>
using namespace std;
class semi_shape_1 {
public: void output() { cout <<" semi_shape_1 works fine.\n"; } virtual ~semi_shape_1();
protected: semi_shape_1(){ output();}
};
class test_semiShape_1 : public semi_shape_1 {
};
int main()
{ test_semiShape_1 ts1; return 0;
}
</iostream>

semi_shape_1 - это басовый класс, а test_semiShape_1 получен из него. Когда я запускаю код, я получаю две ошибки следующим образом:

Error1 ошибка LNK2019: неразрешенный внешний символ "общественность: виртуальный __thiscall semi_shape_1 :: ~ semi_shape_1 (аннулируется)" (?? 1semi_shape_1 @@UAE @XZ) ссылка в функции "общественность: виртуальный __thiscall test_semiShape_1 :: ~ test_semiShape_1 (аннулируется)" (?? 1test_semiShape_1 @@UAE @XZ) C:\Users\ME\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.obj

Error2 ошибка LNK1120: 1 неразрешенных внешних C:\Users\ME\Documents\Visual Studio 2012\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe 1

В чем проблема с моим кодом, пожалуйста? Машина: Windows 7. IDE: visual studio 2012.

3 ответа

Не существует реализации деструктора базового класса. Компилятор будет неявно создать один, если вы не предоставите определение, но поскольку вы его предоставили, вы также должны обеспечить реализацию. У Тони есть ответ:

Просто измените virtual ~ semi_shape_1(); к виртуальному ~ semi_shape_1() {}


Вы должны предоставить определение деструктора.

virtual ~semi_shape_1() {}

или на С++ 11

virtual ~semi_shape_1() = default;

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

virtual ~semi_shape_1() = 0;
// ...
semi_shape_1::~semi_shape_1() = default;


Вы объявили деструктора, но не выполнили его.

licensed under cc by-sa 3.0 with attribution.