我不明白我为这个程序得到的输出。

时间:2012-12-18 03:52:48

标签: c++ class inheritance polymorphism derived-class

class polygon的继承程序,它是基类,我创建了一个派生类调用矩形。在我的多边形基类中,我有一个构造函数和析构函数以及面积和周长的两个print函数。在我的派生类中,我有一个构造函数和析构函数以及两个print函数用于区域和周边以及calc areacalc perimeter函数。 我不明白的是我现在运行这个程序时得到的输出。我想要的输出是area = 45 perimeter = 28。当我使用rect_1.calcarea()但希望使用rect_1.printarea()时,我会收到此输出。

#include<iostream>
using namespace std;

class polygon 
{

protected:
    double area;
    double perimeter;
public:
    polygon(){}
    virtual ~polygon(){ }
    virtual double printarea() const { return area ;} 
    virtual double printperimeter() const { return perimeter ;}
};

class rectangle : public polygon
{

public:
    rectangle(double , double ) ;
    ~rectangle(){ }
    double calcarea() ;
    double calcperimeter() ;
    virtual double printarea() const { return area ;} 
    virtual double printperimeter() const { return perimeter ;}

private:
    double length;
    double width;
};

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

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

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

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

    cout<<"The Area of Rect_1 is " <<rect_1.printarea() <<endl;
    cout<<"The Perimeter of Rect_1 is " <<rect_1.printperimeter() <<endl;

    system("pause");
}

2 个答案:

答案 0 :(得分:2)

printarea()只是返回成员变量area的值。你是a)不是把它初始化为任何东西而b)不计算任何地方的区域。

我猜测你的输出是零或垃圾 - 取决于编译器选项 - 因为区域没有初始化(即给定一个值)。

如果你在矩形的构造函数中调用calcarea(),或者在实例化它的实例后调用main,那么printarea()将产生正确的值。您甚至可以在calcarea()内拨打printarea(),以确保在需要时该值始终是最新的。

答案 1 :(得分:0)

尝试以下解决方案。这将解决您的问题。

以下是我改变的内容:
我已将Polygon设为抽象类,因为您只想调用printarea的{​​{1}}或printperimeter。此外,我分别致电Polygoncalcarea。虽然可以在calcperimeter printarea / printperimeter的正文中完成相同的操作。无需致电Rectanglecalcarea

calcperimeter