关于继承和派生的实际设计
来源:互联网 发布:路由器访客网络设置 编辑:程序博客网 时间:2024/04/30 00:00
一、设计一个图形基类:Shape,在此基础上派生Rectangle、Circle、Triangle类。
1、Cirlce类基本信息:圆心坐标、半径;
Rectangle类基本信息:长、宽;
Triangle类基本信息:三个顶点坐标;
其中:成员变量为private属性,成员函数为public属性;
2、每个图形类有多个构造函数:缺省构造函数、带参数的构造函数;
3、每个图形类有计算图形的面积getArea(),显示图形的基本信息函数show(),修改基本信息的函数set(形参)。以Circle类为例:通过getArea()计算圆的面积,show()函数中显示圆心坐标、直径、周长、面积等基本信息;set(int x,int y, int r)函数可以修改圆心坐标和半径。
[实验提示]
1、各类图形面积的计算方法不同, 因此不能在基类Shape中统一确定计算的方法。
2、用虚函数实现不同图形面积的计算。在基类Shape中实现计算面积功能的函数为虚函数,在派生类中定义各自的同名函数实现具体功能。
3、要求:使用基类指针,通过基类指针调用确定的派生类对象中的面积计算函数,实现面积的计算。
[测试数据]
Circle:
圆心(30,45) 半径:35
Rectangle:
长:30 宽:53
Triangle:
顶点:(34,45)、(89,45)、(54,67)
#include <iostream>
#include<cmath>
using namespace std;
const float PI=(float)3.14159; //给出圆周率
class Shape{ //基类
public:
virtual double getArea(){}
virtual double getPerimeter(){}
virtual void Show(){}
};
class Triangle :public Shape //Triangle 类的定义
{
public: //外部接口
Triangle(); //无参构造函数
Triangle(int x1, int y1,int x2,int y2,int x3,int y3); //有参构造函数
void Set(int x1, int y1,int x2,int y2,int x3,int y3); //设置三个顶点
double getArea(); //计算三角形面积
double getPerimeter(); //计算三角形周长
void Show(); //取三条边长,三角形面积,三角形周长
private:
int xx1,yy1, xx2,yy2, xx3, yy3;
};
//类的实现
Triangle::Triangle() //无参构造函数初始化数据成员
{
xx1=0;yy1=0;xx2=0;yy2=0;xx3=0;yy3=0;
cout<<"无参构造函数被调用"<<endl;
}
Triangle::Triangle(int x1, int y1,int x2,int y2,int x3,int y3) //有参构造函数初始化数据成员
{
xx1=x1;yy1=y1;xx2=x2;yy2=y2;xx3=x3;yy3=y3;
cout<<"有参构造函数被调用"<<endl;
}
void Triangle::Set(int x1, int y1,int x2,int y2,int x3,int y3) //设置三个顶点
{
xx1=x1;yy1=y1;xx2=x2;yy2=y2;xx3=x3;yy3=y3;
}
double Triangle::getArea() //计算三角形的面积
{
double a,b,c;
a=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
b=sqrt((xx2-xx3)*(xx2-xx3)+(yy2-yy3)*(yy2-yy3));
c=sqrt((xx3-xx1)*(xx3-xx1)+(yy3-yy1)*(yy3-yy1));
return a*b*abs(abs(1-((a*a+b*b-c*c)/(2*a*b))*((a*a+b*b-c*c)/(2*a*b))))/2;
}
double Triangle::getPerimeter() //计算三角形的周长
{
double a,b,c;
a=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
b=sqrt((xx2-xx3)*(xx2-xx3)+(yy2-yy3)*(yy2-yy3));
c=sqrt((xx3-xx1)*(xx3-xx1)+(yy3-yy1)*(yy3-yy1));
return a+b+c;
}
void Triangle::Show() //显示三边长,面积,周长
{
double a,b,c;
a=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
b=sqrt((xx2-xx3)*(xx2-xx3)+(yy2-yy3)*(yy2-yy3));
c=sqrt((xx3-xx1)*(xx3-xx1)+(yy3-yy1)*(yy3-yy1));
cout<<"三边为:"<<a<<" "<<b<<" "<<c<<" "<<endl;
cout<<"面积:"<<getArea()<<endl;
cout<<"周长:"<<getPerimeter()<<endl;
}
class Rectangle :public Shape //Rectangle类的定义
{
public: //外部接口
Rectangle(); //无参构造函数
Rectangle(int NewL, int NewW); //有参构造函数
void Set(int NewL,int NewW); //设置长度,宽度
double getArea();//计算矩形面积
double getPerimeter();//计算矩形周长
void Show(); //取长度 ,宽度 ,矩形面积,矩形周长
private: //私有数据成员
int Length,Width;
};
//类的实现
Rectangle::Rectangle() //无参构造函数初始化数据成员
{
Length=0;Width=0;
cout<<"无参构造函数被调用"<<endl;
}
Rectangle::Rectangle(int NewL, int NewW) //有参构造函数初始化数据成员
{
Length=NewL;Width=NewW;
cout<<"有参构造函数被调用"<<endl;
}
void Rectangle::Set(int NewL,int NewW) //设置长度,宽度
{
Length=NewL;Width=NewW;
}
double Rectangle::getArea() //计算矩形的面积
{
return Length*Width;
}
double Rectangle::getPerimeter() //计算矩形的周长
{
return 2*(Length+Width);
}
void Rectangle::Show() //显示长度 ,宽度 ,矩形面积,矩形周长
{
cout<<"长:"<<Length<<endl;
cout<<"宽:"<<Width<<endl;
cout<<"面积:"<<getArea()<<endl;
cout<<"周长:"<<getPerimeter()<<endl;
}
class Circle :public Shape //Circle类的定义
{
public:
Circle(); //无参构造函数
Circle(int r); //有参构造函数
void set(int x,int y, int r); //设置圆心,半径
double getArea(); //取面积
double getPerimeter();//计算圆周长
void Show(); //显示圆心,直径,周长,面积
private:
int xx,yy, radius;
};
Circle::Circle() //无参构造函数初始化数据成员
{
radius=0;cout<<"无参构造函数被调用"<<endl;
}
Circle::Circle(int r) //有参构造函数初始化数据成员
{radius=r;cout<<"有参构造函数被调用"<<endl;}
void Circle::set(int x,int y, int r) //设置圆心,半径
{
xx=x;yy=y;radius=r;
}
double Circle::getPerimeter() //取面积
{
return 2*PI*radius;
}
double Circle::getArea() //取面积
{
return PI*radius*radius;
}
void Circle::Show() //显示 圆心,直径,周长,面积
{
cout<<"圆心:("<<xx<<","<<yy<<")"<<endl;
cout<<"直径:"<<2*radius<<endl;
cout<<"周长:"<<getPerimeter()<<endl;
cout<<"面积:"<<getArea()<<endl;
}
//主函数实现
int main() {
int x1,y1,x2,y2,x3,y3;
double a,b,c;
int x,y,r;
int L,W;
int which;
int flag = 1;
while(flag)
{
do {
cout << "0 == exit ,1 == Triangle, 2 == Rectangle, 3 == Circle"<<endl;
cin >> which;
}while (which < 0 || which > 3);
switch (which) {
case 0: {flag=0; break;}
case 1: {
cout<<"输入三个顶点:"<<endl;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
b=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
c=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
if((a+b)>c&&(a+c)>b&&(b+c)>a) //判断能否构成三角形
{
Triangle p(x1,y1,x2,y2,x3,y3); //声明 Triangle对象
p.Show();
}
else printf("输入错误!");
system("pause");
system("cls");
break;
}
case 2: {
cout<<"输入长、宽:"<<endl;
cin>>L>>W;
Rectangle K(L,W);
K.Show();
system("pause");
system("cls");
break;
}
case 3:
{
cout<<"输入圆心:";
cin>>x>>y;
cout<<"输入半径:" ;
cin>>r;
Circle C(r);
C.Show();
system("pause");
system("cls");
break;
}
if(flag==0) break;
}
}
return 0;
}
- 关于继承和派生的实际设计
- C++的派生和继承
- 继承和派生的基本知识
- 类的继承和派生
- C++ 继承和派生的
- 类的继承和派生
- 类的继承和派生
- 简单的继承和派生
- c++学习之-- 关于继承和派生
- 关于继承与派生的小结
- 使用类的继承和派生设计公司职员的信息管理
- C语言类的继承和派生
- 继承和派生的应用2
- C++类的继承和派生
- 作业5.18 类的继承和派生
- 继承和派生的初次接触
- C++ 类的派生和继承
- C++类的继承和派生
- Java的核心总结
- 常见端口介绍
- 不要拼接Sql,而要使用参数的好处之2(转载)
- DIV CSS网页布局:最小高度(min-height)的妙用
- Flex 学习站点汇总
- 关于继承和派生的实际设计
- 一个字符压缩的程序
- 练习做项目——供新手参考
- SQL时间函数
- 用SrvRepor远程监控管理Linux服务器
- IEnumerable IEnumerator区别
- 实力铸就、十年成长:热烈祝贺华夏互联排名进入全球十万
- GRIDVIEW 用法
- Spring Security 2.0 中文文档