美文网首页
十八、纯虚函数和抽象类

十八、纯虚函数和抽象类

作者: 木鱼_cc | 来源:发表于2018-06-11 16:01 被阅读0次

1.基本概念

  • 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本

  • 纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件的模块功能划分)

纯虚函数的语法

virtual 类型 函数名(参数表) = 0 

一个具有纯虚函数的基类称为抽象类

2.纯虚函数和抽象类

//图形类
//拥有纯虚函数的类,称为抽象类
class Shape
{
public:
//是一个抽象的接口,说明图形是有一个得到面积的方法
   virtual double getArea() = 0;//一个求图形面积的接口

   virtual double printArea() = 0;//定义一个打印面积的接口

};

//圆类
//如果一个子类继承了抽象类,那么一定要重写这个纯虚函数
class Circle:public Shape
{
public:
   Circle(double r){
      this->r = r;
   }
   virtual double getArea(){
       return 3.14*r*r;
   }

  virtual void printArea(){
     cout<<"圆的面积是:"<<this->getArea()<<endl;
  }

private:
    double r;//半径

};

//实现一个正方形
class Rect:public Shape
{
public:
   Rect(int a){
      this->a =a;
   }

    virtual double getArea() {
          return a*a;
   }

   virtual double printArea() {
       cout<<"正方形的面积是:"<<this->getArea()<<endl;
   }
private:
    int a;//边长
};


//一个传递抽象类指针的架构函数
void PrintArea(Shape *p){
 //抽象类的指针就可以调用纯虚函数接口
  //  cout<<sp->getArea()<<endl;//在此处发生了多态

   p->printArea();
}



int main(void)
{
  Shape *s;//报错!纯虚函数不可被实例化

  Shape *sp = new Circle(2.0);
 
  printArea(sp);
  
  delete sp;

 sp = new Rect(10);

  //创建一个正方形的对象,用抽象类指针(父类指针)指向子类对象
  printArea(sp);

  delete sp;

  return 0;
}


  • 含有纯虚函数的类,称为抽象基类,不可实列化。即不能创建对象,存在 的意义就是被继承,提供族类的公共接口。
  • 纯虚函数只有声明,没有实现,被“初始化”为0。
  • 如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数,派生类仍然为纯虚基类。

3.多继承和抽象类

  • 绝大多数面向对象语言都不支持多继承,绝大多数面向对象语言都支持接口的概念
  • C++中没有接口的概念,C++中可以使用纯虚函数实现接口
  • 接口类中只有函数原型定义,没有任何数据的定义
//抽象类1
class Interface1
{
public:
    //纯虚函数
    virtual void func(int a,int b) = 0;
    virtual void func2(int a) = 0;
};

//抽象类2
class Interface2
{
public:
    //纯虚函数
    virtual void func(int a,int b) = 0;
};

//当纯虚函数在多继承中出现了重复,那么在子类中只要重新重写一次就可以了
class Child:public Interface1,public Interface2
{
public:
   virtual void func(int a,int b)
   {
    cout<<"a = "<<a<<" b = "<<b<<endl;
   }

   virtual void func2(int a){
      cout<<"a = "<<a<<endl;
  }

};

int main(void)
{

  Child c;
  c.func(10,20);

  Interface *if1 = new Child;
  if1->func(10,20);
  if1->func2(100);

  Interface *if2 = new Chiild;
  if2->func(20,30);
 //if2没办法调func2,因为他没有!
  return 0;
}

相关文章

网友评论

      本文标题:十八、纯虚函数和抽象类

      本文链接:https://www.haomeiwen.com/subject/jgufeftx.html