#include
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;
};
class Circle:public Point{
public:
Circle(float x=0, float y=0,float r=0);
void setRedius(float);
float getR() const{return radius;}
virtual void shapeName() const {
cout << "Circle:";
}
float area() const;
friend ostream & operator << (ostream &, const Circle &);
protected:
float radius;
};
class Cylinder:public Circle{
public:
Cylinder(float x=0, float y=0,float r=0,float h=0);
void setHeight(float);
float getHeight() const{return height;}
virtual void shapeName() const {
cout << "Cylinder:";
}
float area() const;
float volume() const;
friend ostream & operator << (ostream &, const Cylinder &);
protected:
float height;
};
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="<shapeName();
cout << "x=" << point.getX() <<",y=" << point.getY() << "\n area=" << pt->area() <<"\n volumn="<volume() << "\n\n";
pt = &circle;
pt->shapeName();
cout << "x=" << circle.getX() <<",y=" << circle.getY() << ",r=" << circle.getR() <<"\n area=" << pt->area() <<"\n volumn="<volume() << "\n\n";
pt = &cylinder;
pt->shapeName();
cout << "x=" << cylinder.getX() <<",y=" << cylinder.getY() << ",r=" << cylinder.getR() <<"\n area=" << pt->area() <<"\n volumn="<volume() << "\n\n";
}
虚函数的作用就是为了实现多态,和php的延时绑定是一样的。
函数重载是静态的,在横向上的功能, 虚函数是类继承上的功能,是动态的。