深入解析C++编程中的纯虚函数和抽象类

2020-01-06 13:45:49王旭

Point从Shape继承了3个成员函数,由于“点”是没有面积和体积的,因此不必重新定义area和volume。虽然在Point类中用不到这两个函数,但是Point类仍然从Shape类继承了这两个函数,以便其派生类继承它们。shapeName函数在Shape类中是纯虚函数, 在Point类中要进行定义。Point类还有自己的成员函数( setPoint, getX, getY)和数据成 员(x和y)。

第(3)部分

 

 
  1. //声明Circle类  class Circle:public Point 
  2. {  public: 
  3. Circle(float x=0,float y=0,float r=0);  void setRadius(float ); 
  4. float getRadius( )const;  virtual float area( )const; 
  5. virtual void shapeName( )const {cout<<"Circle:";}//对虚函数进行再定义  friend ostream &operator <<(ostream &,const Circle &); 
  6. protected:  float radius; 
  7. };  //声明Circle类成员函数 
  8. Circle::Circle(float a,float b,float r):Point(a,b),radius(r){}  void Circle::setRadius(float r):radius(r){} 
  9. float Circle::getRadius( )const {return radius;}  float Circle::area( )const {return 3.14159*radius*radius;} 
  10. ostream &operator <<(ostream &output,const Circle &c)  { 
  11. output<<"["<<c.x<<","<<c.y<<"], r="<<c.radius;  return output; 

在Circle类中要重新定义area函数,因为需要指定求圆面积的公式。由于圆没有体积,因此不必重新定义volume函数,而是从Point类继承volume函数。shapeName函数是虚函数,需要重新定义,赋予新的内容(如果不重新定义,就会继承Point类中的 shapeName函数)。此外,Circle类还有自己新增加的成员函数(setRadius, getRadius)和数据成员(radius)。