什么是抽象类?

  • 面向对象中的抽象概念

    • 在进行面向对象分析时,会发现一些抽象的概念!

图形的面积如何计算?

clipboard.png

在现实中需要知道具体的图形类型才能求面积,所以对概念上的”图形“求面积是没有意义的!

class Shape
{
public:
    doubel area()
    {
        return 0;
    }
};

Shape 只是一个概念上的类型,没有具体对象!

问: Shape 类有必要存在有
答:有。现实世界中存在图形概念

  • 面向对象中的抽象类

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

面向对象中的抽象类

  • Shape 是现实世界中各种图形的抽象概念
  • 因此:

    • 程序中必须能够反应抽象的图形
    • 程序中通过抽象类表示图形的概念
    • 抽象类不能创建对象,只能用于继承

抽象类与纯虚函数

  • C++ 语言中没有抽象类的概念
  • C++ 中通过纯虚函数实现抽象类
  • 纯虚函数是指只定义原型的成员函数
  • 一个 C++ 类中存在纯虚函数就成为了抽象类

当设计一个类时,如果确认是一个为父类,就要考虑它有没有可能成为纯虚类。判断标准:父类会不会产生对象

  • 纯虚函数语法规则
class Shape
{
public:
    virtual double area() = 0;
};

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

编程实验: 抽象类初探

#include <iostream>

using namespace std;

class Shape
{
public:
    virtual double area() = 0;
};

class Rect : public Shape
{
private:
    int ma;
    int mb;
public:
    Rect(int a, int b)
    {
        ma = a;
        mb = b;
    }
    double area()
    {
        return ma * mb;
    }
};

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

void area(Shape* p)                 // Shape 是一个抽象类,可以用来定义指针、引用
{
    double r = p->area();           
    
    cout << "r = " << r << endl;
}

int main()
{
    Rect rect(1, 2);
    Circle circle(10);
    
    area(&rect);
    area(&circle);

    return 0;
}
输出:
r = 2
r = 314
  • 抽象类只能用作父类被继承
  • 子类必须实现纯虚函数的具体功能
  • 纯虚函数被实现后成为虚函数
  • 如果子类没有实现纯虚函数,则子类成为抽象类

接口

  • 满足下面条件的 C++ 类则称为接口

    • 类中没有定义任何的成员变量
    • 所有的成员函数都是公有的
    • 所有的成员函数都是纯虚函数
    • 接口是一种特殊的抽象类

一组行为的规范(函数原型)

编程: 接口初探

串口、网络、USB 等通讯行为的抽象:

#include <iostream>

using namespace std;

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

int main()
{
    

    return 0;
}

小结

  • 抽象类用于描述现实世界中的抽象概念
  • 抽象类只能被继承不能被创建对象
  • C++ 中没有抽象类的概念
  • C++ 中通过纯虚函数实现抽象类
  • C++ 中没有接口的概念
  • 类中只存在纯虚函时成为接口
  • 接口是一种特殊的抽象类

以上内容参考狄泰软件学院系列课程,请大家保护原创!


TianSong
737 声望139 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧