//扩展程序:创建一个三角形类
//修改create_object函数,使得程序支持三角形的创建
//和求面积、打印等操作
#include <iostream>
using namespace std;
class Shape {
public:
virtual double getArea() const = 0;
virtual void print() const = 0;
virtual ~Shape(){}
};
class Circle : public Shape {
public:
Circle(int = 0, int = 0, double = 0.0);
virtual double getArea() const; // 返回面积
virtual void print() const; // 输出Circle 类对象t
private:
int x, y; // 圆心座标
double radius; // 圆半径
}; // 派生类Circle定义结束
class Rectangle : public Shape {
public:
Rectangle(int = 0, int = 0); // 构造函数
virtual double getArea() const; // 返回面积
void print() const; // 输出Rectangle类对象
protected:
int a, b; // 矩形的长和宽
}; // 派生类
double Shape::getArea() const
{
cout << "基类的getArea函数,面积是 ";
return 0.0;
} // Shape类getArea函数的定义
class Sanjiao : public Shape {
public:
Sanjiao(double cValue, double dValue);
virtual double getArea() const; // 返回面积
virtual void print() const; // 输出Circle 类对象t
private:
double c, d; // 底,高
};
//double Shape::getArea() const
//{
// cout << "基类的getArea函数,面积是 ";
// return 0.0;
//}
void Shape::print() const
{
cout << "Base class Object" << endl;
} //Shape类print函数定义
Circle::Circle(int xValue, int yValue, double radiusValue)
{
x = xValue; y = yValue;
radius = radiusValue;
} // Circle类构造函数
double Circle::getArea() const
{
cout << "Circle类的getArea函数,面积是 ";
return 3.14159 * radius * radius;
} // Circle类getArea函数定义
void Circle::print() const
{
cout << "center is ";
cout << "x=" << x << " y=" << y;
cout << "; radius is " << radius << endl;
} // Circle类print函数定义
Rectangle::Rectangle(int aValue, int bValue)
{
a = aValue; b = bValue;
} // Rectangle类构造函数
double Rectangle::getArea() const
{
cout << "Rectangle类的getArea函数,面积是 ";
return a * b;
} // Rectangle类getArea函数定义
void Rectangle::print() const
{
cout << "hight is " << a;
cout << "width is" << b << endl;
}
Sanjiao::Sanjiao(double cValue, double dValue)
{
c = cValue; d = dValue;
} // Rectangle类构造函数
double Sanjiao::getArea() const
{
cout << "Sanjiao类的getArea函数,面积是 ";
return 0.5*c * d;
} // Rectangle类getArea函数定义
void Sanjiao::print() const
{
cout << "hight is " << c;
cout << "bottom is " << d << endl;
}
class Cube : public Rectangle { //派生类Cube的定义
public:
Cube(int x = 0, int y = 0, int z = 0) :Rectangle(x, y), c(z){};
double getArea() const;
void print() const;
private:
int c;
};
double Cube::getArea() const
{
return a*b*c;
}
void Cube::print() const
{
cout << "Cube:h=" << c << ",length=" << a
<< ",width=" << b << ",Area=" << a*b*c << endl;
}
void creat_object(Shape **ptr)
{
char type;
*ptr = NULL; //空指针
do{
cout << "创建对象。请选择:";
cout << "c:Circle类对象;r:Rectangle类对象;u:Cube类对象;s:Sanjiao类对象" << endl;
cin >> type;
switch (type)
{
case 'c': //创建Ciecle类对象
{int xx, yy;
double rr;
cout << "请输入圆心的座标和圆的半径:";
cin >> xx >> yy >> rr;
*ptr = new Circle(xx, yy, rr);
break;
}
case 'r': //创建Rectangle类对象
{
int aa, bb;
cout << "请输入矩形的长和宽:";
cin >> aa >> bb;
*ptr = new Rectangle(aa, bb);
}
break;
case 'u': //创建Cube类对象
{
int aa, bb, cc;
cout << "请输入立方体的长、宽、高:";
cin >> aa >> bb >> cc;
*ptr = new Cube(aa, bb, cc);
}
break;
case 's': //创建Sanjiao类对象
{
double cc, dd;
cout << "请输入三角形的底、高:";
cin >> cc >> dd;
*ptr = new Sanjiao(cc, dd);
}
break;
default:cout << "类型错误,请重新选择\n";
}
} while (*ptr == NULL);
}
void display_area(Shape *ptr)
{
cout << "显示所创建对象的面积,调用的是" << endl;
cout << ptr->getArea() << endl;
}
void delete_object(Shape *ptr)
{
delete(ptr);
}
int main()
{
Shape *shape_ptr;
creat_object(&shape_ptr);
display_area(shape_ptr);
delete_object(shape_ptr);
return 0;
}
10.3修改
最新推荐文章于 2024-01-31 15:15:51 发布