谭浩强版C++实例 第六章 多态性与虚函数(4个)


//6.1先建立一个Point(点)类,包含数据成员xy(坐标点),以它为基类,派生一个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.46.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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值