类型),分别表示矩形的长和宽;
b)为矩形类Rectangle提供一个具有两个长和宽参数的构造函数,长和宽参数的默认值分别为3.0和4.0; c)覆盖基类Shape的area ()和perimeter()函数,用于获得矩形的面积和周长,使得矩形类Rectangle为实体类;
(4)定义圆类Circle继承自抽象图形类Shape。要求:
a)为圆类Circle新增一个数据成员radius(double类型),用于表示圆形的半径; b)为圆类Circle提供一个具有半径值的构造函数,半径参数的默认值为2.0; c)覆盖基类Shape的area ()和perimeter()函数,用于获得圆的面积和周长,使得圆类Circle为实体类。注意:圆周率?的取值为3.14。
具有上述功能的图形类Shape及其派生类的测试代码及相应输出结果如下:
void main(){ } ?
程序输出:
L1:三角形面积:6, 周长:12 L2:矩形面积:12, 周长:14 L3:圆面积:12.56, 周长:12.56
s= &circle;
cout<<\圆面积:\周长:\ //L3
s= &rectangle;
cout<<\矩形面积:\周长:\ //L2
Shape *s;
s= ▵
//图形类Shape指针
Triangle triangle; Circle circle;
//三角形对象 //矩形对象 //圆形对象
Rectangle rectangle;
cout<<\三角形面积:\周长:\ //L1
参考答案:
#include
class Shape { // 抽象类的定义 public: };
virtual double area()=0; virtual double perimeter()=0;
class Triangle:public Shape { // 三角形类 private: };
class Rectangle:public Shape { // 矩形类 private: };
class Circle:public Shape { // 圆类 private:
double length; double height;
Rectangle(double length=3.0, double height=4.0){ }
double area(){ }
double perimeter(){ }
return 2*(length+height); return length*height; this->length = length; this->height = height; double perimeter(){ }
return edge1+edge2+edge3; double area(){ }
double halfSum = (edge1+edge2+edge3)/2.0;
return sqrt(halfSum*(halfSum-edge1)*(halfSum-edge2)*(halfSum-edge3)); double edge1; double edge2; double edge3;
Triangle(double edge1=3.0, double edge2=4.0, double edge3=5.0){ }
this->edge1 = edge1; this->edge2 = edge2; this->edge3 = edge3;
public:
public:
};
double radius;
Circle(double radius=2.0){ }
double area(){ }
double perimeter(){ }
return 2*radius*3.14; return radius*radius*3.14; this->radius=radius;
public:
5.3.2. 抽象图形类Graph(2)
请定义图形类Shape,表示抽象的图形,用于描述现实世界中的三角形、矩形或圆形,并通过面向对象程序设计的继承结构和多态性实现不同图形的面积和周长的计算与输出。具体要求如下:
(1)在Shape中定义纯虚函数double area()=0 和double perimeter()=0,分别用
于获得图形的面积和周长。纯虚函数void display()=0则用以显示具体图形的信息。
(2)从抽象图形类Shape派生出实体类Triangle,用于表示三角形。要求:
a)为三角形类Triangle新增三个数据成员edge1(double类型)、edge2(double类型)和edge3(double类型),分别表示三角形的三条边;
b)为三角形类Triangle提供一个具有三条边的边长的构造函数,三条边的默认长度值分别为3.0、4.0、5.0;
c)覆盖基类Shape的area ()和perimeter()函数,用于获得三角形的面积和周长,使得三角形类Triangle为实体类。注意:若三角形的三条边长为a, b, c,令p=(a+b+c)/2,则三角形面积的平方s^2=p*(p-a)*(p-b)*(p-c);
(3)从抽象图形类Shape派生出实体类Rectangle,用于表示矩形。要求:
a)为矩形类Rectangle新增两个数据成员length(double类型)和height(double类型),分别表示矩形的长和宽;
b)为矩形类Rectangle提供一个具有两个长和宽参数的构造函数,长和宽参数的默认值分别为3.0和4.0; c)覆盖基类Shape的area ()和perimeter()函数,用于获得矩形的面积和周长,使得矩形类Rectangle为实体类;
(4)定义圆类Circle继承自抽象图形类Shape。要求:
a)为圆类Circle新增一个数据成员radius(double类型),用于表示圆形的半径; b)为圆类Circle提供一个具有半径值的构造函数,半径参数的默认值为2.0; c)覆盖基类Shape的area ()和perimeter()函数,用于获得圆的面积和周长,使得圆类Circle为实体类。注意:圆周率?的取值为3.14。
(5)圆的内接正方形类InnerSquare和外切正方形类OuterSquare都继承自圆类。
要求:
a)为InnerSquare类和OuterSquare类各新增一个数据成员edge,用于表示正方形的边长; b)为InnerSquare类和OuterSquare类各提供一个带有一个参数radius(double类型)的构造函数,该参数表示正方形对应的圆的半径,构造函数必须实现正方形边长的初始化。 c)InnerSquare类和OuterSquare类都覆盖抽象基类Shape的两个虚函数area ()和perimeter(),实现圆的内接正方形和外切正方形的面积和周长的计算。
具有上述功能的图形类Shape及其派生类的测试代码及相应输出结果如下:
void main(){ } ?
程序输出:
L1:三角形面积:6, 周长:12 L2:矩形面积:12, 周长:14 L3:圆面积:12.56, 周长:12.56 L4:外切正方形面积:100, 周长:40 L5:内接正方形面积:50, 周长:28.2843
s=new OuterSquare(5.00);
cout<<\外切正方形面积:\周长:\ //L4
s=new InnerSquare(5.00); s= &circle;
cout<<\圆面积:\周长:\ //L3
s= &rectangle;
cout<<\矩形面积:\周长:\ //L2
Shape *s;
s= ▵
//图形类Shape指针
Triangle triangle; Circle circle;
//三角形对象 //矩形对象 //圆形对象
Rectangle rectangle;
cout<<\三角形面积:\周长:\ //L1
cout<<\内接正方形面积:\周长:\ //L5
参考答案:
#include
class Shape { // 抽象类的定义 public: };
class Triangle:public Shape { // 三角形类 private: };
class Rectangle:public Shape { // 矩形类 private:
double length; double height;
Rectangle(double length=3.0, double height=4.0){ }
double area(){ }
double perimeter(){
return length*height; this->length = length; this->height = height; double perimeter(){ }
return edge1+edge2+edge3; double area(){ }
double halfSum = (edge1+edge2+edge3)/2.0;
return sqrt(halfSum*(halfSum-edge1)*(halfSum-edge2)*(halfSum-edge3)); double edge1; double edge2; double edge3;
Triangle(double edge1=3.0, double edge2=4.0, double edge3=5.0){ }
this->edge1 = edge1; this->edge2 = edge2; this->edge3 = edge3; virtual double area()=0; virtual double perimeter()=0;
public:
public: