C++ 接口(抽象类)


C++ 接口 (抽象类)

接口(抽象类)是C++语言中,用于定义一组函数的抽象数据类型的一种特殊方式。它不会被编译器实例化,只用于表示一个类需要实现什么功能。C++语言中的接口也称为纯虚函数。

本文将详细介绍C++中的接口及其使用方法。

接口的定义

接口的定义方法与普通类定义类似,只是在类名后加上“=0”,表示这个类是一个抽象类,只用于作为接口使用:

class MyInterface{
public:
    virtual void doSomething() = 0; // 纯虚函数
};

在接口中,只能存在纯虚函数,这是接口的重要特征。一个纯虚函数的函数体应该为空,如上例中的doSomething函数。

接口的继承

接口的继承方式与普通类继承类似,只是在继承前加上关键字virtual

class MyDerivedClass : public virtual MyInterface{
public:
    void doSomething() override {
        /* do something */
    }
};

上述代码中,MyDerivedClass是从MyInterface派生出来的一个类,它重写了doSomething函数,实现了接口规定的功能。

在实现接口时,应该将接口的纯虚函数全部实现,并声明为公共函数,与接口中的声明一致。

与多态的关系

接口是实现多态的重要手段之一。多态是指同一个函数可以适用于不同类型的参数。在C++中,多态一般通过指针或引用实现。

对于实现多态的函数,一般需要使用虚函数来实现。在接口中,由于函数都是虚函数(纯虚函数),因此使用接口实现多态十分方便。

下面是一个使用接口实现多态的例子:

void callDoSomething(MyInterface& obj){
    obj.doSomething();
}

int main(){
    MyDerivedClass obj1;
    MyDerivedClass2 obj2;

    callDoSomething(obj1); // 输出 obj1 的结果
    callDoSomething(obj2); // 输出 obj2 的结果
}

上述代码中,callDoSomething函数接收一个MyInterface类型的参数,它能够自动转换为MyDerivedClass或者MyDerivedClass2类型的数据。

总结

接口是C++语言中重要的语言特性之一,它使用纯虚函数来定义类的接口,并在实现类中重写这些函数。接口的使用可以帮助我们方便地实现多态。同时,由于接口的特殊性质,它不会被编译器实例化,因此也可以用于定义抽象数据类型。通过掌握接口的作用及其使用技巧,可以让我们更加灵活地利用C++语言实现代码的高效复用。