请看下面的简单代码:
#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;
}
semi_shape_1
是一个贝司类,test_semiShape_1
来自它。
当我运行代码时,我得到两个错误如下:
错误1 错误LNK2019:未解析的外部符号&#34; public:virtual __thiscall semi_shape_1 :: ~lemi_shape_1(void)&#34; (?? 1semi_shape_1 @@ UAE @ XZ)在函数&#34; public:virtual __thiscall test_semiShape_1 :: ~test_semiShape_1(void)&#34;中引用(?? 1test_semiShape_1 @@ UAE @ XZ)C:\ Users \ ME \ Documents \ Visual Studio 2012 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ ConsoleApplication1.obj
错误2 错误LNK1120:1个未解析的外部C:\ Users \ ME \ Documents \ Visual Studio 2012 \ Projects \ ConsoleApplication1 \ Debug \ ConsoleApplication1.exe 1
请问我的代码有什么问题?
机器:Windows 7.
IDE:visual studio 2012。
答案 0 :(得分:2)
没有实现基类的析构函数。如果您不提供定义,编译器将隐式创建一个,但由于您提供了定义,因此您还必须提供实现。托尼的评论有答案:
只需更改virtual~semi_shape_1(); to virtual~semi_shape_1(){}
答案 1 :(得分:1)
您必须为析构函数提供定义。
virtual ~semi_shape_1() {}
或在C ++ 11中
virtual ~semi_shape_1() = default;
或者如果semi_shape_1
应该是一个抽象类,你可以使它纯净,但不要忘记在类定义之外定义它:
virtual ~semi_shape_1() = 0;
// ...
semi_shape_1::~semi_shape_1() = default;
答案 2 :(得分:0)
您已声明了析构函数但未实现它。