1.Cpp中的接口(抽象类)

  • 接口描述了类的行为和功能,而不需要完成类的特定实现接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 “= 0” 来指定的,如下所示,Box类就是一个抽象类:
        class Box{
            public:
                // 纯虚函数
                virtual double getVolume() = 0;
            private:
                int length;
                int width;
                int height;
        };
    
  • 设计抽象类(通常称为ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。因此,如果一个ABC的子类需要被实例化,则必须实现每个虚函数,这也意味着C++支持使用ABC声明接口。如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。可用于实例化对象的类被称为具体类

2.抽象类的实例如下

  • 下面的实例中,基类Shape提供了一个接口getArea(),在两个派生类Rect和Triangle中分别实现了getArea():
        // 基类Shape是个抽象类
        class Shape{
            public:
            // 提供接口框架的纯虚函数
                virtual int getArea() = 0;
                void setLength(int l){
                    length = l;
                }
                void setWidth(int w){
                    width = w;
                }
            protected:
                int length;
                int width;
        };
    
        // 派生类1
        class Rect: public Shape{
            public:
                int getArea(){
                    return length * width;
                }
        };
        // 派生类2
        class Triangle: public Shape{
            public:
                int getArea(){
                    return length * width / 2;
                }
        };
            
    
    
        int main(){
            Rect r;
            Triangle t;
    
            r.setLength(4);
            r.setWidth(5);
            cout << "矩形的面积是: " << r.getArea() << endl;
    
            t.setLength(4);
            t.setWidth(5);
            cout << "三角形的面积是: " << t.getArea() << endl;
            return 0;
        }
    
  • 从上面的实例中,可以看到一个抽象类是如何定义一个接口getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。

3.设计策略

  • 面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的,这些纯虚函数在相应的派生类中被实现。这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

4.抽象类总结

  • 抽象类只能用在其他类的基类,不能定义抽象类的对象
  • 抽象类不能用于参数类型、函数返回值或显示转换的类型
  • 抽象类可以定义抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性