#include<iostream>
using namespace std;
class shape{
public:
virtual float area()const{return 0.0;}
virtual float volume()const{return 0.0;}
virtual void shapename()const=0;
};
class point:public 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(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<<"["<<p.x<<","<<p.y<<"]";
return output;
}
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(float x,float y,float r):point(x,y),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<<"["<<c.x<<","<<c.y<<"],r="<<c.radius;
return output;
}
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(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<<"["<<cy.x<<","<<cy.y<<"],r="<<cy.radius <<",h="<<cy.height;
return output;
}
int main(){
point point1(3.2,4.5);
circle circle1(2.4,1.2,5.6);
cylinder cylinder1(3.5,6.4,5.2,10.5);
point1.shapename();
cout<<point1<<endl;
circle1.shapename();
cout<<circle1<<endl;
cylinder1.shapename();
cout<<cylinder1<<endl;
shape * pt;
pt=&point1;
pt->shapename();
cout<<"x="<<point1.getx()<<",y="<<point1.gety()<<"\n area="<<pt->area()
<<"\n volume="<<pt->volume()<<"\n\n";
pt=&circle1;
pt->shapename();
cout<<"x="<<circle1.getx()<<",y="<<circle1.gety()<<"\n area="<<pt->area()
<<"\n volume="<<pt->volume()<<"\n\n";
pt=&cylinder1;
pt->shapename();
cout<<"x="<<cylinder1.getx()<<",y="<<cylinder1.gety()<<"\n area="<<pt->area()
<<"\n volume="<<pt->volume()<<"\n\n";
return 0;
}