纯虚函数和抽象类

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

纯虚函数的语法
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;    
}    




原文地址:https://www.cnblogs.com/qq209049127/p/10651926.html