Go 接口与 C++接口有何异同
接口定义了一种规范,描述了类的行为和功能,而不做具体实现。
C++ 的接口使用抽象类实现,如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象 类。纯虚函数是通过在声明中使用 “= 0” 来指定的。例如:
class Shape
{
public:
// 纯虚函数
virtual double getArea() = 0;
private:
string name; // 名称
};
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
其中,getArea () 就是纯虚函数。 设计抽象类的目的是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。
派生类需要明确地声明它继承自基类,并且需要实现基类中所有的纯虚函数。
C++ 定义接口的方式称为 “侵入式”,而 Go 采用的是 “非侵入式”,不需要显式声明,只需要实现接口定义的函数,编译器就会自动识别。
C++ 和 Go 在定义接口方式上的不同,也导致了在底层实现上的不同。C++ 通过虚函数表来实现基类调用派生类的函数;而 Go 通过 itab 中的 fun 字段来实现接口变量调用实体类型的函数。C++ 中的虚函数表是在编译期生成的;而 Go 的 itab 中的 fun 字段是在运行期间动态生成的。原因在于,Go 程序中实体类型可能会无意中实现 N 个接口,很多接口并不是开发人员需要的,所以不能为类型实现的所有接口都生成一个 itab,这也是 “非侵入式” 带来的影响;而这在 C++ 中是不存在的,因为派生需要显示声明它继承自哪个基类。
上次更新: 5/9/2023, 10:58:32 AM