定义一个继承层次的例子-Shape类Circle类的定义

http://hi.baidu.com/wolfand11/item/03eec320e8a8228a6e2cc3d8
昨天回复了一个Shape类的问题,涉及到了C++中的多态等问题,这里分析一下。
问题的要求是:定义一个Shape基类,然后定义它的派生类 Circle、Rectangle 、
Triangle,要求每个派生类有输出面积的函数,指定在实现中要使用C++的多态。

我是这样思考这个问题的。
一、定义Shape类
首先,一个图形类,一定会涉及把这个图形画出来。要画出来
就要考虑这个图形在哪儿画,所以我们应该为图形类定义一个Point类型的center成员,
来定为图形。由于每类图形的画法不同所以,需要派生类实现自己的派生类,这里就只定义一个
纯虚函数来要求它的派生类重新实现该函数。virtual void paint() const = 0;
其次,图形有面积,需要输出图形的面积。要输出面积,就要求出面积,但是每个图形类的
求面积方法不同,所以我们定义一个 void printArea() const;用来输出图形面积。
定义一个纯虚函数 virtual float area()=0;来禁止定义Shape类的对象,并要求它的派
生类重新实现这个函数;

这样,我们就定义出了Sharp类。
class Shape
{
public:
Shape( const Point &c = Point() ):center(c){}
virtual void paint() const = 0;
void printArea() const
{
cout << area();
}
protected:
virtual float area() const = 0; //纯虚函数
private:
Point center;  //保存图形的中心点
};
二、定义Circle类

我们从Sharp类派生Circle类的话,只需要实现自己的求面积函数和画图形函数以及构造函数。
首先:要实现上面的那些函数,需要给Circle类增加新的数据成员:半径。于是我们增加一个
float radius; 数据成员。
其次:实现构造函数需要:1、定义给radius数据成员的初始化 2、给基类构造函数传递基类
构造函数参数来初始化从基类派生而来的数据成员。
然后:实现求面积的成员函数。
最后:实现画图形的成员函数,这里只给出函数的声明。

这样就定义除了Circle类了
circle.h
class Circle:public Shape
{
public:
Circle( float r = 0.0 ):radius(r){}
Circle( const Point &c, float  r ):Shape(c),radius(r){}
void paint() const;
protected:
float area() const;
private:
float radius;
static const float pi = 3.14F;
};

circle.cpp
const float Circle::pi;

float Circle::area() const
{
return pi*radius*radius;
}
void Circle::paint() const
{
……
}

其他类的实现和Circle类类似。

当我们实现了这些类以后,我们如何用到C++中的多态呢?
C++的多态是通过基类的引用和基类的指针来实现的。我们定义下面的函数就用到了C++的多态
了。
int main()
{
Shape      *shape;
Circle     circle(10);
Rectangle  rectangle(2,2);
shape = &circle;
shape.printArea();
shape = &rectangle;
shape.printArea();
return 0;
}

程序输出的结果是:314 4

通过这个程序可以看出,我们从已知类派生新类时,若不增加新功能时则只需要实现构造函数和
虚函数。如果要实现新的功能时,例如实现图形的旋转指定角度。则需要定义新的成员函数,以
及实现该函数的成员变量。

你可能感兴趣的:(c++技术类)