Cpp有接口?

今天看到有人说Cpp有接口,我感到很奇怪,因为从来没有听说过。而Java中恰好有interface。目测是把Java的东西拿过来用了。于是就决定查下资料,顺便复习下Java。

虚函数

C++的虚函数需要加上virtual关键字,而只有虚函数才会有动态绑定,根据对象的动态类型来决定调用对应的虚函数。而Java貌似没有这概念,也即是

Java中除了static和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定。

摘自《Java编程思想》第四版Page151

Java中的abstract关键字

在Java中,如果方法加上abstract关键字,就是一个抽象方法,抽象方法仅有声明而没有方法体。

abstract void f();

这里的抽象方法与Cpp的纯虚函数应该类似。

virtual void f() = 0;

包含抽象方法的类叫做抽象类,如果一个类包含一个或多个抽象方法,该类必须限定为抽象的。(否则编译器就会报错)

摘自《Java编程思想》第四版Page169

这里应该和Cpp里面的抽象基类是差不多的,如果继承抽象基类(或抽象类)的派生类不给出所有的纯虚函数(或抽象方法)的定义,就无法实例化,因为该派生类仍然是抽象基类(抽象类)。

之所以上面说差不多,是因为我发现了个好玩的现象,即抽象类可以强行加上abstract关键字定义而不需要一定有抽象方法。即只要一个Java类加上了abstract关键字,它就是一定是一个抽象类。而Cpp并没有与abstract类似的关键字。

Test.java

public class Test
{
    public static void main(String[] args) 
    {
        System.out.println("test");
        T t = new T();
//      S s = new S();
/*
Test.java:7: 错误: S是抽象的; 无法实例化
           S s = new S();
                 ^
1 个错误
*/
        t.f();
        t.g();
    }
}

abstract class S
{
    void f()
    {
        System.out.println("S");
    }
}

class T extends S
{
    void g()
    {
        System.out.println("T");        
    }
}

结果输出:


test
S
T

Java中的接口interface

Java里面的接口,方法全部是抽象方法,变量全部是public static final,对应Cpp的接口,说的应该是只有纯虚函数的抽象基类,然而又有所不同,毕竟即使抽象基类里只有纯虚函数,也不需要全是public的,变量也不需要全是public static的(Cpp变量不能用final)。