以点(point)为基类,派生矩形类,与圆类,在派生类编写求面积周长的方法,分别求圆,矩形的周长与面积
具体的周长面积求解我就不写了,我写下派生类的层次和抽象时的思路吧
如果我来写,大体会是这样的
首先,抽象就是把这几个类的共同点和不同点比较一下,
比如:以点为基类,对于图形来说是有位置的,这个位置就用点来代替。
所以他们肯定有共同的位置,用什么表示呢,用坐标x,y
那就有
class Point
{
public:
Point(int x, int y):m_x(x),m_y(y){};
protect:
int m_x;
int m_y;
}
再看圆形,圆形的位置一般用圆心来表示,那么点的x,y正好代表这个圆心
,那圆形比点的表示多个半径,就叫m_radius吧,于是有
class Circle:public Point
{
public:
Circle(int x, int y, radius):Point(x, y)
{
m_raduis = raduis;
};
float calcArea()//圆形面积
{
return Math.PI * pow(m_raduis, 2);
}
float calcLength()//圆形周长
{
return Math.PI * 2 * m_raduis;
}
protected:
int m_raduis;
}
对于矩形来说,有位置,又有长宽,有两种定义方法
以左上角表达位置,这么表达的话运算比较简单,但是其位置和圆形的位置就有冲突了,也就是说矩形的位置就不代表矩形的图心了。
以矩形的中心店表达矩形的位置,这个运算稍微复杂一点点,但是其位置
是图形的图心,考虑到时从Point继承过来的,那就用图心来代表位置吧
class Rectangle:public Point
{
public:
Rectangle(int width, int height, x, y): Point(x, y)
{
m_halfWidth = width / 2;
m_halfHeight = height/ 2;
}
int calcArea()
{
return 2*m_halfWidth * m_halfHeight*2;
}
int calcLength()
{
return (m_halfWidth + halfHeight)*4;
}
protected:
int m_halfWidth;
int m_halfHeight;
}
补充说几点:
不同的人抽象出来的东西的类和表达方式可能不一样,上面的方式可能是我这个笨蛋作出的一个牵强附会的答案。
聪明人可能会看出这个题目的问题,Point最好的方式不是用作基类,因为在抽象的时候你会发现,这个Point最好的方式可能是单独做为表达位置的类比较合适。
比如有类Point如上
那Circle类可能就直接是一个Point变量代表圆心,一个半径代表半径,即可表达一个圆形
那Rectangle类可以以4个Point点来刻画一个矩形,但是这样做内存代价比较大,也可以使用上面的方式
可以看到Rectangle类,为了具象描述位置和长宽,在构造函数中采用了长宽而非半长半宽的方式,这样的代价就是计算周长和面积的时候多了一次乘法运算。
{
public:
CMyPoint(void);
~CMyPoint(void);
virtual double GetArea() = 0; //面积
virtual double GetCircle() = 0;//周长
protected:
int x;
int y;
};
class CMyCircle:public CMyPoint
{
public:
CMyCircle(int nRadii)
{
m_nRadii = nRadii;
}
~CMyCircle(void);
double GetArea()
{
return 3.14159*m_nRadii*m_nRadii;
}
double GetCircle()
{
return 2*3.14159*m_nRadii;
}
private:
int m_nRadii;
};
class CMyRectangle:public CMyPoint
{
public:
CMyRectangle(int nlength,int nWidth)
{
m_nLength = nlength;
m_nWidth = nWidth;
}
~CMyRectangle(void);
double GetArea()
{
return m_nWidth*m_nLength;
}
double GetCircle()
{
return 2*(m_nLength+m_nWidth);
}
private:
int m_nLength;
int m_nWidth;
};
基类中定义一个纯虚函数 派生类里面分别实现具体的算法
你可以百度一下 虚函数的用法 就明白这样做的原理了
有其他问题也可以向我求助——做有意义的的事
#include<iostream>
#define pi 3.14
using namespace std;
class point
{protected:
double x;
double y;
public:
point(double m,double n) {x=m;y=n;}
void show_Coordinate()
{ cout<<"坐标为:"<<x<<" "<<y<<endl;}
};
class circle:public point
{private:
double radius;
public:
circle(double m,double n,double r):point(m,n)
{radius=r;}
void Circumference()
{cout<<"圆的周长为:"<<2*pi*radius<<endl;}
void area()
{cout<<"圆的面积为:"<<pi*radius*radius<<endl;}
};
class rectangle:public point
{private:
double longth;
double width;
public:
rectangle(double m,double n,double l,double w):point(m,n)
{longth=l; width=w;}
void Circumference()
{cout<<"矩形周长为:"<<2*(longth+width)<<endl;}
void area()
{cout<<"矩形面积为:"<<longth*width<<endl;}
};
void main()
{point p(1.0,2.0);
circle c(1.0,2.0,5);
rectangle r(1.0,2.0,3,4);
p.show_Coordinate();
c.Circumference();
c.area();
r.Circumference();
r.area();
}
你可以百度一下 虚函数的用法 就明白这样做的原理了g
#include<cmath>
#define PI 3.141592
using namespace std;
class Point
{
float x,y;
public:
Point(float a,float b)
{
x=a;
y=b;
}
float Getx()
{
return x;
}
float Gety()
{
return y;
}
};
class Rectangle:public Point
{
float x1,y1;
public:
Rectangle(float a,float b,float c,float d):Point(a,b)
{
x1=c;
y1=d;
}
double Circumference()
{
return abs(y1-Gety())*2+abs(x1-Getx())*2 ;
}
double Area()
{
return abs(y1-Gety())*abs(x1-Getx());
}
};
class Circle:public Point
{
float radius;
public:
Circle(float a,float b,float r):Point(a,b)
{
radius=r;
}
double Circumference()
{
return 2*PI*radius;
}
double Area()
{
return PI*radius*radius;
}
};
void main()
{
Rectangle a(1,2,3,4);
Circle b(1,1,4);
cout<<"矩形的周长为:"<<a.Circumference()<<endl;
cout<<"矩形的面积为:"<<a.Area()<<endl;
cout<<"圆的周长为:"<<b.Circumference()<<endl;
cout<<"圆的面积为:"<<b.Area()<<endl;
}