Программа наследования для class polygon
который является базовым классом, и я создал прямоугольник вызова производного класса. В моем базовом классе многоугольника у меня есть конструктор и деструктор и два print
функции для области и периметра. В моем производном классе у меня есть конструктор и деструктор и два print
функции для области и периметра и calc area
а также calc 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");
}
printarea()
просто возвращает значение переменной-члена area
, Вы а) ничего не инициализируете и б) нигде не вычисляете площадь.
Я бы рискнул предположить, что ваш вывод либо нулевой, либо мусорный — в зависимости от параметров компилятора — потому что область не инициализирована (то есть задано значение).
Если вы позвоните calcarea()
внутри конструктора прямоугольника или в main после создания экземпляра этого экземпляра, затем printarea()
даст правильное значение. Вы могли бы даже позвонить calcarea()
внутри printarea()
чтобы убедиться, что значение всегда актуально, когда это необходимо.
Попробуйте решение ниже. Это решит вашу проблему.
Вот что я изменил:
Я сделал Polygon как абстрактный класс, как вы хотите назвать только printarea
или же printperimeter
из Polygon
, Кроме того, я позвонил calcarea
а также calcperimeter
соответственно. Хотя то же самое можно сделать в теле printarea
/printperimeter
из Rectangle
, Нет необходимости звонить calcarea
а также calcperimeter
,
#include<iostream>
using namespace std;
class polygon
{
protected:
double area;
double perimeter;
public:
polygon(){}
virtual ~polygon(){ }
virtual double printarea() = 0;
virtual double printperimeter() = 0;
};
class rectangle : public polygon
{
public:
rectangle(double , double ) ;
~rectangle(){ }
double calcarea() ;
double calcperimeter() ;
double printarea() { return calcarea();}
double printperimeter() { return calcperimeter() ;}
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");
}