zoukankan      html  css  js  c++  java
  • 第52课 C++中的抽象类和接口

    什么是抽象类
    面向对象中的抽象概念
    在进行面向对象分析时,会发现一些抽象的概念
    图形的面积如何计算?

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

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

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

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

    Shape是现实世界中各种图形的抽象概念
    因此:
    -程序中必须能够反映抽象的图形
    -程序中通过抽象类表示图形的概念
    -抽象类不能创建对象,只能用于继承

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

    纯虚函数的语法规则

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

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

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Shape
    {
    public:
        virtual double area() = 0;
    };
    
    class Rect : public Shape
    {
        int ma;
        int mb;
    public:
        Rect(int a, int b)
        {
            ma = a;
            mb = b;
        }
        double area()
        {
            return ma * mb;
        }
    };
    
    class Circle : public Shape
    {
        int mr;
    public:
        Circle(int r)
        {
            mr = r;
        }
        double area()
        {
            return 3.14 * mr * mr;
        }
    };
    
    void area(Shape* p) //抽象类可以定义指针,但是不能定义对象。可以利用定义的指针调用纯虚函数。p只可能指向抽象类的子类,在子类中肯定实现了area这个函数。
    {
        double r = p->area();
    
        cout << "r = " << r << endl;
    }
    
    int main()
    {
        Rect rect(1, 2);
        Circle circle(10);
        //Shape p;
        area(&rect);
        area(&circle);
    
        return 0;
    }

    抽象类只能用作父类被继承
    子类必须实现纯虚函数的具体功能
    纯虚函数被实现后成为虚函数
    如果子类没有实现纯虚函数,则子类成为抽象类

    满足下面条件的C++类则称为接口
    -类中没有定义任何的成员变量
    -所有的成员函数都是公有的
    -所有的成员函数都是纯虚函数
    -接口是一种特殊的抽象类

    注意:C++语言中没有真正的接口

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Channel
    {
    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;
    }

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

  • 相关阅读:
    被下属骂,记一次矛盾升级——有心无心,蝴蝶效应?
    技术管理进阶——团队合并、解散怎么办?
    “技术转产品”比产品更恶心的几个点
    javaScript系列 [43]TS、Class and ES5
    javaScript系列 [42]node中 require函数的加载过程
    javaScript系列 [52]模板引擎的实现逻辑
    Base64简单介绍
    异或运算(XOR)
    javaScript系列 [51]Rollup 打包器
    javaScript系列 [49] ast && render
  • 原文地址:https://www.cnblogs.com/-glb/p/11967528.html
Copyright © 2011-2022 走看看