C ++派生类和虚拟析构函数

时间:2015-02-16 07:05:44

标签: c++ class visual-studio-2012

请看下面的简单代码:

#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。

3 个答案:

答案 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)

您已声明了析构函数但未实现它。