设为首页 加入收藏

TOP

虚函数和抽象基类的应用 (一)
2014-11-24 00:04:16 来源: 作者: 【 】 浏览:51
Tags:函数 抽象 应用

/*这个实例是对一个典型例子的改写。在程序中使用虚函数和抽象基类。类的层次结构是抽象基类Shape(形状)。Point(点),Circle(圆),Cylinder(圆柱体)都是Shape类的直接派生类和间接派生类*/

//下面是一个完整的程序,为了便于阅读,分段插入了一些文字说明。

程序如下:

第(1)部分

#include

using namespace std;

//声明抽象基类Shape

class Shape

{

public:

virtual float area( )const {return 0.0;}//虚函数

virtual float volume()const {return 0.0;}//虚函数

virtual void shapeName()const =0;//纯虚函数

};

第(2)部分

//声明Point类

class Point:public Shape//Point是Shape的公用派生类

{

public:

Point(float=0,float=0);

void setPoint(float ,float ); float getX( )const {return x;}float getY( )const {return y;}

virtual void shapeName( )const {cout<<″Point:″;}//对虚函数进行再定义

friend ostream & operator <<(ostream &,const Point &);

protected:

float x,y;

};

//定义Point类成员函数

Point::Point(float a,float b)

{x=a;y=b;}

void Point::setPoint(float a,float b)

{x=a;y=b;}

ostream & operator <<(ostream &output,const Point &p)

{ output<<″[″<

return output;

}

第(3)部分

//声明Circle类

class Circle:public Point

{

public:

Circle(float x=0,float y=0,float r=0);

void setRadius(float );

float getRadius( )const;

virtual float area( )const;

virtual void shapeName( )const {cout<<″Circle:″;}//对虚函数进行再定义

friend ostream &operator <<(ostream &,const Circle &);

protected :

float radius;

};

//声明Circle类成员函数

Circle::Circle(float a,float b,float r):Point(a,b),radius(r){}

void Circle::setRadius(float r):radius(r){}

float Circle::getRadius( )const {return radius;}

float Circle::area( )const {return 3.14159*radius*radius;}

ostream &operator <<(ostream &output,const Circle &c){output<<″[″<

return output;}

第(4)部分

//声明Cylinder类

class Cylinder:public Circle

{

public:

Cylinder (float x=0,float y=0,float r=0,float h=0);

void setHeight(float );

virtual float area( )const;

virtual float volume( )const;

virtual void shapeName( )const {cout<<″Cylinder:″;}//对虚函数进行再定义

friend ostream& operator <<(ostream&,const Cylinder&);

protected:

float height;

};

//定义Cylinder类成员函数

Cylinder::Cylinder(float a,float b,float r,float h):Circle(a,b,r),height(h){}

void Cylinder::setHeight(float h){height=h;}

float Cylinder::area( )const{return 2*Circle::area( )+2*3.14159*radius*height;}

float Cylinder::volume( )const{return Circle::area( )*height;}

ostream &operator <<(ostream &output,const Cylinder& cy)

{ output<<″[″<

第(5)部分

//main函数

int main( )

{

Point point(3.2,4.5);//建立Point类对象point

Circle circle(2.4,1.2,5.6);

//建立Circle类对象circle

Cylinder cylinder(3.5,6.4,5.2,10.5);

//建立Cylinder类对象cylinder

point.shapeName();

//静态关联

cout<

circle.shapeName();//静态关联

cout<

cylinder.shapeName();//静态关联

cout<

Shape *pt;//定义基类指针

pt=&point;//指针指向Point类对象

pt->shapeName( );//动态关联

cout<<″x=″<area( )

<<″\\nvolume=″<volume()<<″\\n\\n″;

pt=&circle;//指针指向Circle类对象

pt->shapeName( );//动态关联

cout<<″x=″<area( )

<<″\\nvolume=″<volume( )<<″\\n\\n″;

pt=&cylinder;//指针指向Cylinder类对象

pt->shapeName( );//动态关联

cout<<″x=″<area( )

<<″\\nvolume=″<volume( )<<″\\n\\n″;

return 0;}

程序运行结果如下。

请读者对照程序分析。

Point:[3.2,4.5](Point类对象point的数据:点的坐标)

Circle:[2.4,1.2], r=5.6 (Circle类对象circle的数据:圆心和半径)

Cylinder:[3.5,6.4], r=5.5, h=10.5 (Cylinder类对象cylinder的数据: 圆心、半径和高)

Point:x=3.2,y=4.5 (输出Point类对象point的数据:点的坐标)

area=0 (点的面积)

volume=0 (点的体积)

Circle:x=2.4,y=1.2 (输出Circle类对象circle的数据:圆心坐标)

area=98.5203 (圆的面积)

volume=0 (圆的体积)

Cylinder:x=3.5,y=6.4 (输出Cylinder类对象cylinder的数据:圆心坐标)

area=512.595 (圆的面积)

volume=891.96 (圆柱的体积)

从本例可以进一步明确以下结论:

/*(1)一个基类如果包含一个或一个以上纯虚函数,就是抽象基类。

抽象基

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于C函数声明与定义返回类型不一.. 下一篇线性规划――由百度新大厦说开去

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: