了解多态性的概念,了解虚函数的作用及使用方法,了解静态关联和动态关联的概念和用法,了解纯虚函数和抽象类的概念和用法。
实验要求:
声明抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle(矩形)、Triangle(三角形),用一个函数printArea分别输出以上三者的面积,3个图形的数据在定义对象时给定。
二、实验过程(实验步骤、记录、数据、)
#include
const double PI=3.1415925;
class Shape
{
public:
virtual double area() const {return 0;}
virtual void shapeName() const =0;
};
class Circle:public Shape
{
public:
Circle(double r=0):radius(r){}
virtual double area() const;
virtual void shapeName()const{cout<<"Circle: ";}
friend ostream &operator<<(ostream &,Circle &);
protected:
double radius;
};
class Rectangle:public Circle
{
public:
Rectangle(double l=0,double h=0):lenght(l),height(h){}
double area() const;
void shapeName()const{cout<<"Rectangle: ";}
friend ostream & operator<<(ostream &,Rectangle &);
protected:
double lenght;
double height;
};
class Triangle:public Rectangle
{
public:
Triangle(double d=0,double h=0):dd(d),hh(h){}
double area() const;
void shapeName()const{cout<<"Triangle: ";}
friend ostream & operator<<(ostream &,Triangle &);
void printArea(Circle *p1,Circle c,Rectangle r,Triangle t)
{
p1=&c;p1->shapeName();cout<<c<<endl;
p1=&r;p1->shapeName();cout<<r<<endl;
p1=&t;p1->shapeName();cout<<t<<endl;
}
protected:
double dd;
double hh;
};
double Circle::area()const{return PI*radius*radius;}
ostream &operator<<(ostream &output,Circle &c1)
{
output<<"r="<<c1.radius<<",area="<<c1.area();
return output;
}
double Rectangle::area() const {return lenght*height;}
ostream & operator<<(ostream &output,Rectangle &c1)
{
output<<"l="<<c1.lenght<<",h="<<c1.height<<",area="<<c1.area();
return output;
}
double Triangle::area() const
{
return dd*hh*0.5;
}
ostream & operator<<(ostream &output,Triangle &t1)
{
output<<"d="<<t1.dd<<",h="<<t1.hh<<",area="<<t1.area();
return output;
}
int main ()
{
Circle *p;
Circle c(5);
Rectangle r(5,4);
Triangle t(5,5);
t.printArea(p,c,r,t);
return 0;
}