C++ 我能';我不明白析构函数出了什么问题?

C++ 我能';我不明白析构函数出了什么问题?,c++,constructor,virtual-destructor,C++,Constructor,Virtual Destructor,我有一个名为polygon的类,它是我的基类,其中有面积和周长,我需要从中派生一个矩形类。现在,下面的程序不工作,它给了我以下错误: GS_Inheritance_Program.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall rectangle::~rectangle(void)" (??1rectangle@@UAE@XZ) referenced in function "public

我有一个名为polygon的类,它是我的基类,其中有面积和周长,我需要从中派生一个矩形类。现在,下面的程序不工作,它给了我以下错误:

GS_Inheritance_Program.obj : error LNK2019: unresolved external symbol "public: virtual
 __thiscall rectangle::~rectangle(void)" (??1rectangle@@UAE@XZ) referenced in function 
"public: virtual void * __thiscall rectangle::`scalar deleting destructor'(unsigned int)" 
(??_Grectangle@@UAEPAXI@Z)

这是由于我添加到程序中的析构函数造成的,但当我删除它们时,这两个析构函数都起作用。 我做了一些研究,发现可能是因为我没有正确编译程序.cpp文件。这是我的问题吗?如果没有,我的问题是什么

#include <iostream>
using namespace std;

class polygon
{
protected:
    double area;
    double perimeter;

public:
    polygon(){}
    ~polygon();
    double printperimeter();
    double printarea();
};

double polygon::printperimeter()
{
    return perimeter;
}

double polygon::printarea()
{
    return area;
}

class rectangle:public polygon
{
protected:
    double length;
    double width;
public:
    rectangle(double = 1.0, double = 1.0);
    ~rectangle();
    double calcarea();
    double calcperimeter();
};

rectangle::rectangle(double l, double w)
{
    length = l;
    width = w;
}

double rectangle::calcarea()
{
    area = length*width;
    return printarea();
}

double rectangle::calcperimeter()
{
    perimeter = 2*(length+width);
    return printperimeter();
}

void main()
{
    rectangle rect_1 (9.0, 5.0);

    cout<<"The Area of Rect_1 is " <<rect_1.calcarea() <<endl;

    system("pause");
}
#包括
使用名称空间std;
类多边形
{
受保护的:
双区;
双周长;
公众:
多边形(){}
~polygon();
双重打印周长();
双重打印区域();
};
双多边形::打印周长()
{
返回周长;
}
双多边形::printarea()
{
返回区;
}
类矩形:公共多边形
{
受保护的:
双倍长度;
双倍宽度;
公众:
矩形(双精度=1.0,双精度=1.0);
~rectangle();
双距();
双calcperimeter();
};
矩形::矩形(双l,双w)
{
长度=l;
宽度=w;
}
双矩形::calcarea()
{
面积=长度*宽度;
返回打印区域();
}
双矩形::CalcPrimeter()
{
周长=2*(长度+宽度);
返回printpermiture();
}
void main()
{
矩形矩形矩形1(9.0,5.0);

cout您没有添加析构函数。您说您添加了析构函数,但实际上没有添加。因此链接器正在查找它们,但没有找到它们

你可以改变一下:

            ~rectangle();


您在类中声明了析构函数。但您从未定义过它们。为什么您要声明函数,然后却无法定义它们?您声明了
polygon::~polygon()
rectangle::~rectangle()
。但这两个函数都没有定义

你基本上是在对编译器撒谎。你通过声明一个函数来做出承诺,然后由于没有定义它而违背了承诺。因此出现了错误


P.S.和<代码> int main()/<代码>,而不是<代码>空格main()/< > > /< p>除非您没有包含所有代码,否则声明析构函数,但绝不给它们提供体。在C++中,必须使用<代码> int main(空隙)< /C> >或<代码> int main(int ARCC,char *ARGV)
;返回类型为
void
是无效的选项。分号在第二个矩形代码中是任意的,请忽略它。另外,请参阅Sutter/Alexendrescu的“C++编码标准”第50项关于虚拟析构函数:“规则应该是使基类析构函数在且仅当它们是公共的时候才是虚拟的”因此,您的
多边形
应该有一个
virtual~polygon(){}
声明。
            ~rectangle() { ; }