52_C++中的抽象类和接口

1. 什么是抽象类?

面向对象中的抽象类

  • 可用于表示现实世界中的抽象概念
  • 是一种只能定义类型,而不能产生对象的类
  • 只能被继承并重写相关函数
  • 直接特征是相关函数没有完整的实现

2. 抽象类与纯虚函数

  • C++中没有抽象类的概念
  • C++中通过纯虚函数实现抽象类
  • 纯虚函数是指只定义原型的成员函数
  • 一个C++类中存在纯虚函数就成为了抽象类
  • 纯虚函数的语法规则:
class Shape
{
public:
    virtual double area() = 0;      
};

“= 0 ” 用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体

编程说明:抽象类的初探

#include <iostream>
#include <string>

using namespace std;

class Shape         // abstract class
{
public:
    virtual double area() = 0;      
};
 
class Rect : public Shape
{
    double ma;
    double mb;
public:
    Rect(double a, double b)
    {
        ma = a;
        mb = b;
    }
    
    double area()
    {
        return ma * mb; 
    }
};

class Circle : public Shape
{
    double mr;
public:
    Circle(double r)
    {
        mr = r;
    } 
    
    double area()
    {
        return 3.14 * mr * mr;
    }
};

void area(Shape* p)
{
    double s = p->area();
    cout << "area: " << s << endl;
}

int main()
{
    Rect r(1, 2);
    Circle c(10);
    
    area(&r);
    area(&c);
    
    return 0;
}

输出结果:

area: 2
area: 314

Shape为抽象类,不能够定义对象,但可以定义指针,因此Shape* p是有意义的,对应的指针只能够指向抽象类的子类,在抽象类的子类中,会实现纯虚函数。

结论:
(1) 抽象类只能作为父类被继承
(2) 子类必须实现纯虚函数的具体功能
(3) 纯虚函数被实现后成为虚函数
(4) 如果子类没有实现纯虚函数,则子类成为抽象类

3. 接口

满足下面三个条件的C++类成为接口
(1) 类中没有定义任何的成员变量
(2) 所有的成员函数都是公有的
(3) 所有的成员函数都是纯虚函数

接口是一种特殊的抽象类

#include <iostream>
#include <string>

using namespace std;

class Channel           // interfaced
{
public:
    virtual bool open() = 0;
    virtual void close() = 0;
    virtual bool send(char* buf, int len) = 0;
    virtual int receive(char* buf, int len) = 0;
};

int main()
{   
    return 0;
}

4.小结

  • 抽象类用于描述现实世界中的抽象概念
  • 抽象类只能被继承不能创建对象
  • C++中没有抽象类的概念
  • C++中通过纯虚函数实现抽象类
  • 类中只存在纯虚函数的时成为接口
  • 接口是一种特殊的抽象类
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。