//6.1先建立一个Point(点)类,包含数据成员x,y(坐标点),以它为基类,派生一个Circle(圆)类,增加数据成员r(半径)。
//再以Circle类为直接类;派生出一个Cylinder(圆柱体)类;在增加数据成员h(高),要求编写程序,重载运算符“<<”和“>>”
//使之能用于输出以上类对象
#include <iostream.h>
class Point
{
public:
Point(float x=0,float y=0);
void setPoint(float ,float);
float getX()const {return x;}
float getY()const {return y;}
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<<"]"<<endl;
return output;
}
//test main
/*int main()
{
Point p(3.5,6.4);
cout<<"x="<<p.getX()<<",y="<<p.getY()<<endl;
p.setPoint(6.5,8.6);
cout<<"p(new):"<<p<<endl; //<<重载了
return 0;
}*/
class Circle:public Point
{
public:
Circle(float x=0,float y=0,float r=0);
void setRadius(float);
float getRadius()const;
float area()const;
friend ostream &operator<<(ostream &,const Circle &);
protected:
float radius;
};
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;
}
//test main
/*int main()
{
Circle c(3.4,6.4,5.2);
cout<<"origial circle:\nx="<<c.getX()<<",y="<<c.getY()<<",r="<<c.getRadius()
<<",area="<<c.area()<<endl;
c.setPoint(5,5);
c.setRadius(7.5);
cout<<"new circle:\n"<<c;
Point &pRef=c;
cout<<"pRef:"<<pRef;
return 0;
}*/
class Cylinder:public Circle
{
public:
Cylinder(float x=0,float y=0,float r=0,float h=0);
void setHeight(float);
float getHeight()const;
float area()const;
float volume()const ;
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::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;
}
int main()
{
Cylinder cy1(3.5,6.4,5.2,10);
cout<<"\noriginal cylinder:\nx="<<cy1.getX()<<",y="<<cy1.getY()<<",r="<<cy1.getRadius()<<",h="<<cy1.getHeight()
<<"\narea="<<cy1.area()<<",volume="<<cy1.volume()<<endl;
cy1.setHeight(15);
cy1.setRadius(7.5);
cy1.setPoint(5,5);
cout<<"\nnew cylinder:\n"<<cy1;
Point &pRef=cy1;
cout<<"\npRef as a Point:"<<pRef;
Circle &cRef=cy1;
cout<<"\ncRef as a Circle:"<<cRef;
return 0;
}
//6.2基类与派生类有同名函数
//虚函数的作用display()前去掉或添加关键字virtual
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
Student(int ,string,float);
virtual void display();
protected:
int num;
string name;
float score;
};
Student::Student(int n,string nam,float s)
{
num=n;
name=nam;
score=s;
}
void Student::display()
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
cout<<endl;
}
class Graduate:public Student
{
public:
Graduate(int ,string ,float,float);
virtual void display();
private:
float pay;
};
void Graduate::display()
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
cout<<"pay:"<<pay<<endl;
cout<<endl;
}
Graduate::Graduate(int n,string nam,float s,float p):Student(n,nam,s),pay(p){}
int main()
{
Student stud1(1001,"Li",87.2);
Graduate grad1(2001,"wang",98.3,434.3);
Student *pt=&stud1;
pt->display();
pt=&grad1;
pt->display();
return 0;
}
//6.3派生类对象析构函数时的执行情况
#include <iostream>
using namespace std;
class Point
{
public:
Point (){}
virtual ~Point (){cout<<"executing Point destructor"<<endl;}
};
class Circle:public Point
{
public:
Circle(){}
~Circle(){cout<<"executing Circle destructor"<<endl;}
private:
int radius;
};
int main()
{
Point *p=new Circle;
delete p;
return 0;
}
//6.4对6.1进行改写,在程序中使用虚函数和抽象基类;类的层次结构的顶层是抽象基类shape(形状)。Point(点),Circle(圆),Cylinder
//(圆柱体)都是Shape类的直接派生和间接派生类
#include <iostream.h>
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)
{
cout<<"["<<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*2.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 point(3.2,4.5);
Circle circle(2.4,1.2,5.6);
Cylinder cylinder(3.5,6.5,5.2,10.5);
point.shapeName();
cout<<point<<endl;
circle.shapeName();
cout<<circle<<endl;
cylinder.shapeName();
cout<<cylinder<<endl;
Shape *pt;
pt=&point;
pt->shapeName();
cout<<"x="<<point.getX()<<",y="<<point.getY()<<"\narea="<<pt->area()<<"\nvolume="<<pt->volume()<<endl<<endl;
pt=&circle;
pt->shapeName();
cout<<"x="<<circle.getX()<<",y="<<circle.getY()<<"\area="<<pt->area()<<"\nvolume="<<pt->volume()<<endl<<endl;
pt=&cylinder;
pt->shapeName();
cout<<"x="<<cylinder.getX()<<",y="<<cylinder.getY()<<"\narea="<<pt->area()<<"\nvolume="<<pt->volume()<<endl;
return 0;
}