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

C++ derived class and virtual destructor

本文关键字:虚拟 析构函数 派生 C++      更新时间:2023-10-16

请查看下面的简单代码:

#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;
}

CCD_ 1是一个低音类,CCD_。当我运行代码时,我得到两个错误如下:

错误1错误LNK2019:未解析的外部符号"public:virtual __thiscall semi_shape_1::~semi_shape _1(void)"(?1semi_shape_1@@UAE@XZ)在函数"public:virtual __thiscall testrongemiShape_1::~testrongemiShape _1(void)"中引用(??1testrongemishae_1@@UAE@XZ)C:\Users\ME\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1.obj

错误2错误LNK1120:1个未解析的外部C:\Users\ME\Documents\Visual Studio 2012\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe 1

请问我的代码有什么问题
计算机:Windows 7。
IDE:visualstudio2012。

基类的析构函数没有实现。如果不提供定义,编译器将隐式创建一个,但由于提供了定义,因此还必须提供实现。托尼的评论有答案:

只需更改virtual_semi_shape_1();到虚拟~semi_shape_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;

您已经声明了一个析构函数,但没有实现它。