C++中的Java接口等价物是什么?

28

11
C++支持完全的多重继承,因此不像Java那样区分类和接口。如果您创建一个具有所有纯虚方法的类,则相当于Java接口。 - DaoWen
1
一个只有纯虚函数的抽象类。 - obataku
另外,考虑使用VC++的'__interface'关键字。请查阅MSDN。 - MasterMastic
这个问题 https://dev59.com/tlnUa4cB1Zd3GeqPcJ5L 是一个更精确的重复(但本身已被关闭为我上面链接的那个问题的重复)。 - jogojapan
如果你创建一个只有纯虚函数的类,那么这等同于Java中的接口。但实际上还有一些不同之处。请参考我的回答。 - curiousguy
@close-voters:你们通过将这个问题关闭为“一个已经被关闭的重复问题的副本”,从而阻止了任何真正的回答,而该问题本身又是作为一个所谓的与之稍微相关的问题的重复而被关闭的。当你们想要将一个问题关闭为一个已经关闭的问题的重复时,请更加努力地控制自己的冲动。谢谢。 - Cheers and hth. - Alf
2个回答

35

在C++中,只包含纯虚函数的类代表一个接口。

例如:

// Define the Serializable interface.
class Serializable {
     // virtual destructor is required if the object may
     // be deleted through a pointer to Serializable
    virtual ~Serializable() {}

    virtual std::string serialize() const = 0;
};

// Implements the Serializable interface
class MyClass : public MyBaseClass, public virtual Serializable {
    virtual std::string serialize() const { 
        // Implementation goes here.
    }
};

4
你需要使用虚拟继承来模拟Java接口实现。FTFY. - Cheers and hth. - Alf
1
-1,这是抽象类,而不是接口。你不能通过它的接口拥有对象,即接口不能有公共析构函数(除非它是IDestructible 接口)。 - Abyx
2
@Abyx 这是专门针对Java的吗?在C++中,只要接口的析构函数被声明为虚拟的,就可以通过一个指向接口的指针删除对象(如果这样做是合适的话)。是否合适取决于应用程序。如果不合适,则将析构函数声明为受保护的,以强制执行该规则。 - StackedCrooked
@Abyx "interface不能有public析构函数" 来源在哪里?C++的官方定义是什么? - curiousguy
@Abyx,“i.e.接口不能有公共解构函数。” Bjarne Stroustrup不同意你的说法:"公共虚拟解构函数是一种可靠的技术" - Gill Bates

-5

为了模拟Java中的interface,您可以使用仅有纯虚函数的普通基类。

您需要使用虚继承,否则您可能会得到重复继承:在C++中,同一类可以成为多个基类。这意味着在这种情况下访问该基类将是不明确的。

C++ 没有提供与Java interface完全相等的功能:在C++中,只能在具有虚函数声明的类的派生类中重写虚函数,而在Java中,可以在基类中声明方法的覆盖者。

[例子:

struct B1 {
    void foo ();
};

struct B2 {
    virtual void foo () = 0;
};

struct D : B1, B2 {
    // no declaration of foo() here
};

D 继承了两个函数声明:B1::foo()B2::foo()

B2::foo() 是纯虚函数,所以 D::B2::foo() 也是;B1::foo() 没有覆盖 B2::foo(),因为 B2 不是 B1 的派生类。

因此,D 是一个抽象类。

--示例结束]

无论如何,为什么要在 C++ 中模拟 Java 的任意限制呢?

编辑:添加了示例以进行澄清。


1
@DaoWen:请注意,这个答案在技术上是错误的,而且提问者拒绝修正它。 - Cheers and hth. - Alf
1
@Cheers和hth。- Alf:你能否详细说明为什么它是不正确的? - DaoWen
5
第三段至少有两种解释,但都是不正确的。在C++中,你可以像Java一样在接口的实现中继承。这就是这个上下文中虚继承的含义。在第二段中,“好奇的人”提到的部分只是间接相关的:它是允许类似Java的实现继承的基础的一部分,但并不能使其成为可能。 - Cheers and hth. - Alf
1
Java中的“接口”并不是一种“限制”。它是一种很好的方式,可以保证在无法提供通用X函数作为实现的情况下,类可以在某些情况下执行X操作,因为实现太过依赖于类的工作方式。 - thecoshman
@Cheersandhth.-Alf,你能用事实支持你的批评吗? - curiousguy
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接