多文件程序包含:
头文件.h
源文件.cpp
主函数.cpp
//声明抽象基类Shape
//Shape.h
class Shape
{
public:
virtual float area() const { return 0.0; } //虚函数
virtual float volume() const { return 0.0; } //虚函数
virtual void shapeName() const=0; //纯虚函数
};
//声明类Point
//Point.h
class Point:public Shape //Point是Shape的公用派生类
{
public:
Point( float x=0,float y=0); //构造函数
void setPoint(float,float); //设置坐标值
float getX() const { return x; } //读x的坐标
float getY() const { return y; } //读y的坐标
virtual void shapeName() const { cout<<"Point:"; } //对虚函数进行在定义
friend ostream &operator <<(ostream&,const Point&);
protected:
float x,y; //受保护成员
};
//声明派生类Circle
//Circle.h
class Circle:public Point //circle是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的派生类Cylinder
//Cylinder.h
class Cylinder:public Circle
{
public:
Cylinder( float x=0,float y=0,float r=0,float h=0); //构造函数
void setHeight(float); //设置圆柱高
float getHeight() const; //读取圆柱高
virtual float area() const; //计算圆表面积
virtual float volume() const; //计算圆柱体积
virtual void shapeName() const { cout<<"Cylinder:"; }
friend ostream& operator <<(ostream&,const Cylinder &);
protected:
float height; //圆柱高
};
//Point.cpp文件
#include<iostream>
using namespace std;
#include"Shape.h" //需要包含的头文件
#include"Point.h"
//下面定义Point类的成员函数
Point::Point(float a,float b) //对x,y初始化
{ x=a; y=b; }
void Point::setPoint(float a,float b) //为x,y赋新值
{ x=a; y=b; }
//重载运算符“<<”,使之能输出点的坐标
ostream & operator <<(ostream &output,const Point &p)
{ output<<"["<<p.x<<","<<p.y<<"]"<<endl;
return output;
}
//circle.cpp文件
#include<iostream>
using namespace std;
#include"Shape.h" //需要包含的头文件
#include"Point.h"
#include"Circle.h"
//定义构造函数,对圆心坐标和半径初始化
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<<"Center=["<<c.x<<","<<c.y<<"],r="<<c.radius<<",area="<<c.area()
<<endl;
return output;
}
//Cylinder.cpp文件
#include<iostream>
using namespace std;
#include"Shape.h" //需要包含的头文件
#include"Point.h"
#include"Circle.h"
#include"Cylinder.h"
//构造函数
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::getHeight() const{ return height; }
//计算圆柱表面积
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<<"Center=["<<cy.x<<","<<cy.y<<"],r="<<cy.radius<<",h="<<cy.height
<<"\narea="<<cy.area()<<",volume="<<cy.volume()<<endl;
return output;
}
//主函数文件
//main.cpp
#include<iostream>
using namespace std;
#include"Shape.h"
#include"Point.h"
#include"Circle.h"
#include"Cylinder.h"
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<<point<<endl;
circle.shapeName(); //静态关联
cout<<circle<<endl;
cylinder.shapeName(); //静态关联
cout<<cylinder<<endl<<endl;
Shape *pt; //定义基类指针
pt=&point; //指针指向Point类对象
pt->shapeName(); //动态关联
cout<<"x="<<point.getX();
cout<<",y="<<point.getY()<<endl;
cout<<"area="<<pt->area()<<endl;
cout<<"volume="<<pt->volume()<<endl;
cout<<endl;
pt=&circle; //指针指向Circle类对象
pt->shapeName(); //动态关联
cout<<"x="<<point.getX();
cout<<",y="<<point.getY()<<endl;
cout<<"area="<<pt->area()<<endl;
cout<<"volume="<<pt->volume()<<endl;
cout<<endl;
pt=&cylinder; //指针指向Cylinder类对象
pt->shapeName(); //动态关联
cout<<"x="<<point.getX();
cout<<",y="<<point.getY()<<endl;
cout<<"area="<<pt->area()<<endl;
cout<<"volume="<<pt->volume()<<endl;
cout<<endl;
system("pause");
return 0;
}
/*说明:在主函数中调用有关函数并输出结果。
先定义Point类对象point,Circle类对象circle和Cylinder类对象cylinder。
然后分别通过对象名point,circle和cylinder调用了shapeName函数,这是属于静态关联,
在编译阶段就能确定应调用哪一个类的shapeName函数。同时用重载的运算符“<<”来输出
各对象的信息,可以验证对象初始化是否正确。
再定义一个指向基类shape对象的指针变量pt,使它先后指向3个派生类对象point,circle,cylinder
然后通过指针调用各函数,如pt->shapeName(),pt->area(),pt->volume().
这时通过动态关联分别确定调用哪个函数。分别输出不同对象信息。*/