照着谭浩强C++的书上的例题敲的,例12.4 虚函数和抽象基类的应用
#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:Point(float x=0,float y=0);void setPoint(float,float);float getX() const {return x;}float getY() const {return y;}virtual void shapName() 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<<"]"<<endl; 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 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<<"["<<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 point(3.2,4.5);Circle circle(2.4,1.2,5.6);Cylinder cylinder(3.5,6.4,5.2,10.5);point.shapName();cout<<point<<endl;
circle.shapeName();cout<<circle<<endl;
cylinder.shapeName();cout<<cylinder<<endl<<endl;
Shape *pt;pt=&point;pt->shapeName();cout<<"x="<<point.getX()<<",y="<<point.getY()<<"\narea="<<pt->area()<<"\nvolume="<<pt->volume()<<"\n\n";
pt=&circle;pt->shapeName();cout<<"x="<circle.getX()<<",y="<<circle.getY()<<"\narea="<<pt->area()<<"\nvolume="<<pt->volume()<<"\n\n";
pt=&cylinder;pt->shapeName();cout<<"x="<cylinder.getX()<<",y="<<cylinder.getY()<<"\narea="<<pt->area()<<"\nvolume="<<pt->volume()<<"\n\n"; return 0;
}
结果运行有错误
error C2440: '=' : cannot convert from 'class Point *' to 'class Shape *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
lx12_4.exe - 7 error(s), 6 warning(s)I
#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:Point(float x=0,float y=0);void setPoint(float,float);float getX() const {return x;}float getY() const {return y;}virtual void shapName() 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<<"]"<<endl; 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 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<<"["<<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 point(3.2,4.5);Circle circle(2.4,1.2,5.6);Cylinder cylinder(3.5,6.4,5.2,10.5);point.shapName();cout<<point<<endl;
circle.shapeName();cout<<circle<<endl;
cylinder.shapeName();cout<<cylinder<<endl<<endl;
Shape *pt;pt=&point;pt->shapeName();cout<<"x="<<point.getX()<<",y="<<point.getY()<<"\narea="<<pt->area()<<"\nvolume="<<pt->volume()<<"\n\n";
pt=&circle;pt->shapeName();cout<<"x="<circle.getX()<<",y="<<circle.getY()<<"\narea="<<pt->area()<<"\nvolume="<<pt->volume()<<"\n\n";
pt=&cylinder;pt->shapeName();cout<<"x="<cylinder.getX()<<",y="<<cylinder.getY()<<"\narea="<<pt->area()<<"\nvolume="<<pt->volume()<<"\n\n"; return 0;
}
结果运行有错误
error C2440: '=' : cannot convert from 'class Point *' to 'class Shape *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
lx12_4.exe - 7 error(s), 6 warning(s)I