美文网首页
C++中的抽象类和接口

C++中的抽象类和接口

作者: nethanhan | 来源:发表于2017-10-14 10:57 被阅读0次

    抽象类

    • 面向对象中的抽象类

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

    • 因此:

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

    纯虚函数

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

    这里 = 0 用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体。
    举一个例子:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    //抽象类 Shape
    class Shape
    {
    public:
        //声明一个纯虚函数
        virtual double area() = 0;
    };
    
    //继承Shape抽象类
    class Rect : public Shape
    {
        int ma;
        int mb;
    public:
        Rect(int a, int b)
        {
            ma = a;
            mb = b;
        }
        //实现父类的纯虚函数
        //然后成为虚函数
        double area()
        {
            return ma * mb;
        }
    };
    
    //继承Shape抽象类
    class Circle : public Shape
    {
        int mr;
    public:
        Circle(int r)
        {
            mr = r;
        }
        //实现父类的纯虚函数
        //然后成为虚函数
        double area()
        {
            return 3.14 * mr * mr;
        }
    };
    
    //这里使用到多态特性
    void area(Shape* p)
    {
        double r = p->area();
        
        cout << "r = " << r << endl;
    }
    
    int main()
    {
        //定义2个子类
        Rect rect(1, 2);
        Circle circle(10);
        
        //传递子类对象,使用多态特性
        area(&rect);
        area(&circle);
        
        return 0;
    }
    

    输出结果为:

    r = 2
    r = 314
    

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

    接口

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

    举个例子:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    //定义接口Channel
    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++中的抽象类和接口

          本文链接:https://www.haomeiwen.com/subject/vesxuxtx.html