zoukankan      html  css  js  c++  java
  • 纯虚函数和抽象类

     基本概念
    纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本
    纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件的模块功能划分)

    纯虚函数的语法
    virtual 类型 函数名(参数表) = 0;

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

    纯虚函数和抽象类 

    #include <iostream>
    using namespace std;    
    ////⾯向抽象类编程(⾯向⼀套预先定义好的接⼝编程)
    class Figure    //抽象类
    {    
    public:    
    //阅读⼀个统⼀的界⾯(接⼝),让⼦类使⽤,让⼦类必须去实现
    virtual void getArea() = 0;    //纯虚函数
    };    
    class Circle : public Figure    
    {    
    public:    
            Circle(int a, int b)    
                    {    
              this->a = a;    
              this->b = b;    
                    }    
        virtual void getArea()    
                    {    
                     cout<<"圆形的⾯积: "<<3.14*a*a<<endl;;    
                    }    
    private:    
    int a;    
    int b;    
    };    
    class Tri : public Figure    
    {    
    public:    
            Tri(int a,intb)    
              {    
          this->a = a;    
          this->b = b;    
              }    
    virtual void getArea()    
              {    
               cout<<"三⾓形的⾯积:    "<<a*b/2<<endl;;    
              }    
    private:    
    int a;    
    int b;    
    };    
    class Square : public Figure    
    {    
    public:    
           Square(int a,int b)    
                 {    
            this->a = a;    
            this->b = b;
                 }    
    virtual void getArea()    
                 {    
                  cout<<"四边形的⾯积:    "<<a*b<<endl;
                 }    
    private:    
    int a;    
    int b;    
    };    
    void area_func(Figure *base)    
                 {    
                  base->getArea();    //会发⽣多态
            }
    int main()    
    {    
    //Figure f;    //抽象类不能被实例化
                    Figure *base = NULL;    //抽象类不能被实例
                    Circle c1(10,20);    
                    Tri t1(20,30);    
                    Square s1(50,60);    
    //⾯向抽象类编程(⾯向⼀套预先定义好的接⼝编程
                    area_func(&c1);    
                    area_func(&t1);    
                    area_func(&s1);    
    return 0;    
    }    

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

    绝大多数面向对象语言都不支持多继承,绝大多数面向对象语言都支持接口的概念
    C++中没有接口的概念,C++中可以使用纯虚函数实现接口
    接口类中只有函数原型定义,没有任何数据的定义 

    class Interface    
    {    
    public:    
    virtual void  func1() = 0;    
    virtual void  func2(int i) = 0;    
    virtual void  func3(int i) = 0;        
    };
    #include <iostream>
    using namespace std;    
    /*
                C++中没有接⼝的概念
                C++中可以使⽤纯虚函数实现接⼝
    接⼝类中只有函数原型定义,没有任何数据的定义。
        */
    class Interface1    
    {    
    public:    
    virtual void  print()  = 0;    
    virtual int   add(int a,int b) = 0;    
    };    
    class Interface2    
    {    
    public:    
    virtual void   print()  = 0;    
    virtual int    add(int a,int b) = 0;    
    virtual int    sub(int a,int b) = 0;    
    };    
    class parent    
    {    
    public:    
    int a;    
    };    
    class Child : public parent, public Interface1,public Interface2    
    {    
    public:    
    void print()    
        {    
         cout<<"Child::print"<<endl;    
        }    
    int add(int a,int b)    
        {    
      return a + b;    
        }    
    int sub(int a,int b)    
        {    
      return a - b;    
        }    
    };    
    int main()    
    {    
        Child  c;    
        c.print();    
        cout<<c.add(3,5)<<endl;    
        cout<<c.sub(4,6)<<endl;    
        Interface1* i1 = &c;    
        Interface2* i2 = &c;    
        cout<<i1->add(7,8)<<endl;    
        cout<<i2->add(7,8)<<endl;    
    return 0;    
    }    




  • 相关阅读:
    微信转发或分享朋友圈带缩略图、标题和描述的实现方法
    apache一个IP多个站点的配置方法
    微信网页扫码登录的实现
    laravel take(3) 读取最近三条信息
    微信卡劵、微信卡包,必须是认证订阅号或认证服务号
    CSS3 去除苹果浏览器按钮input[type="submit"]和input[type="reset"]的默认样式
    使用laravel5.4结合easywechat进行微信开发--基本配置
    Class 'QrCode' not found ? 和 laravel 生成二维码接口(Simple QrCod)
    windows redis的启动 和 Laravel中Redis的使用
    改变checkbox的默认样式
  • 原文地址:https://www.cnblogs.com/qq209049127/p/10651926.html
Copyright © 2011-2022 走看看