建立一个形状类Shape作为基类,派生出圆类Circle和矩形类Rectangle,求出面积并获取相关信息。

类的继承 作业题:(7月29日写)

1.建立一个形状类Shape作为基类,派生出圆类Circle和矩形类Rectangle,求出面积并获取相关信息。具体要求如下:
(1)形状类Shape
(a)保护数据成员
double x,y:对于不同的形状,x和y表示不同的含义,如对于圆,x和y均表示圆的半径,而对于矩形,x表示矩形的长,y表示矩形的宽。访问权限定义为保护类型是为了能被继承下去,以便派生类能直接访问x和y。
(b)公有成员函数
构造函数Shape(double _x,double _y):用_x、_y分别初始化x、y。
double GetArea():求面积,在此返回0.0。
(2)圆类Circle,从Shape公有派生
(a)公有成员函数
Circle(double r):构造函数,并用r构造基类的x和y。
double GetArea():求圆的面积。
double GetRadius():获取圆的半径。
(3)矩形类Rectangle,从Shape公有派生
(a)公有成员函数
Rectangle(double l,double w) :构造函数,并用l和w构造基类的x和y。
double GetArea():求矩形的面积。
double GetLength():获取矩形的长。
double GetWidth():获取矩形的宽。
(4)在主函数中对派生类进行测试。注意,在程序的开头定义符号常量PI的值为3.14。测试的输出结果如下:
circle:r=1, area=3.14
rectangle:length=3, width=4, area=12
 

以下是我自己写的程序:

#include <iostream>
#define pi 3.14
//const double pi=3.14;

using namespace std;

class Shape
{
protected:
	double x;//对于不同的形状,x和y表示不同的含义
	double y;
	//如对于圆,x和y均表示圆的半径,
	//而对于矩形,x表示矩形的长,y表示矩形的宽。
	//访问权限定义为保护类型是为了能被继承下去,以便派生类能直接访问x和y。
public:
	Shape(double _x,double _y);  //用_x、_y分别初始化x、y。
	double GetArea();            //求面积,在此返回0.0。
};

Shape::Shape(double _x,double _y)
{
	x=_x;
	y=_y;
}

double Shape::GetArea()
{
	return 0.0;
}

class Circle : public Shape
{
public:
	Circle(double r);      //构造函数,并用r构造基类的x和y。
	double GetArea();      //求圆的面积。
	double GetRadius();    //获取圆的半径。
};

Circle::Circle(double r) : Shape(r,r)
{
}

double Circle::GetArea()
{
	return (pi*x*x);
}

double Circle::GetRadius()
{
	return x;
} 

class Rectangle : public Shape
{
public:
	Rectangle(double l,double w);   //构造函数,并用l和w构造基类的x和y。
	double GetArea();          //求矩形的面积。
	double GetLength();        //获取矩形的长。
	double GetWidth();         //获取矩形的宽。
};

Rectangle::Rectangle(double l,double w):Shape(l,w)
{	
}

double Rectangle::GetArea()
{
	return x*y;
}          
	
double Rectangle::GetLength()
{
	return x;
}  

double Rectangle::GetWidth()
{
	return y;
}  

int main()
{
	Circle c1(1);
	cout << "circle :" ;
	cout << "r = " << c1.GetRadius() << " " ;
	cout << "area = " << c1.GetArea() << endl;
	
	Rectangle r1(3,4);
	cout << "rectangle :" ;
	cout << "length = " << r1.GetLength() << " " ;
	cout << "width = " << r1.GetWidth() << " " ;
	cout << "area = " << r1.GetArea() << endl;
	
	return 0;
}

执行结果:

我在写程序的时候发现两个派生类的构造函数的函数体并不需要写入任何东西,只需要传入参数即可,因为子类在构造时一定会先构造父类的对象;而这里并没有出现其他的变量,因此不需要写入函数体。但派生类的构造函数需要用到对象初始化列表,后面跟上父类的构造函数及传进的参数
Circle::Circle(double r) : Shape(r,r)   和   Rectangle::Rectangle(double l,double w) : Shape(l,w) 

因为一些变量为受保护类型,不可以直接使用c1.x或c1.y这样子的形式,因此用函数GetLength()等这类函数取出所需的受保护值。


 

猜你喜欢

转载自blog.csdn.net/zys15195875600/article/details/81268153