Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多重继承:Java与C++; 最近,在阅读了一些编程语言和实践书籍的文章后,提到java中的多接口继承不会遇到C++中的多类继承问题。_Java_C++_Inheritance - Fatal编程技术网

多重继承:Java与C++; 最近,在阅读了一些编程语言和实践书籍的文章后,提到java中的多接口继承不会遇到C++中的多类继承问题。

多重继承:Java与C++; 最近,在阅读了一些编程语言和实践书籍的文章后,提到java中的多接口继承不会遇到C++中的多类继承问题。,java,c++,inheritance,Java,C++,Inheritance,但我不明白为什么会这样。在C++实现错误中,java如何使用多个接口继承??< /p> 是否有一种方法来代替C++中的多重继承,以避免实现问题?? 为了使最后一句话更具体,我们可以说: class A {...}; class B : public A {...}; class C : public A {...}; class D : public B, public C {...}; 然后类D继承类B,C,这两个类都继承类A。因此,如果A有一个字段变量,那么B,C将有相同的变量名,那么D会

但我不明白为什么会这样。在C++实现错误中,java如何使用多个接口继承??< /p> <>是否有一种方法来代替C++中的多重继承,以避免实现问题?? 为了使最后一句话更具体,我们可以说:

class A {...};
class B : public A {...};
class C : public A {...};
class D : public B, public C {...};
然后类D继承类B,C,这两个类都继承类A。因此,如果A有一个字段变量,那么B,C将有相同的变量名,那么D会有什么变量(从B或C继承)。为了避免这种情况,我们可以编写上面的代码,而不需要多次继承,但结果类似吗

这个问题并不是重复的,因为它不是集中在本例中的最终继承是什么,而是要理解Java-C++多重继承之间的区别(参见上面的第一个问题),以及是否有一种方法可以克服某些多重继承问题(如上所述)。

Java(与C++不同)不允许出现状态,因此不会出现故障

它允许通过接口对类型进行多重继承(一个类可以实现多个接口)

从Java8开始,通过接口中的
default
方法,还有行为的多重继承

为了避免这种情况,我们是否可以编写上面的代码而不使用多重继承,但具有类似的结果

下面是一个简单的工作示例:

struct A {};
struct B {};
struct C {};

struct D {
    operator A&() { return a; }
    operator B&() { return b; }
    operator C&() { return c; }

private:
    A a;
    B b;
    C c;
};

void f(const B &b) {}

int main() {
    D d;
    f(d);
}
如果您不想创建明确的层次结构,但仍然希望在需要引用
B
的情况下使用
D
的实例,则上述解决方案非常有效。
正如您所看到的,它基于组合而不是继承。
当然,它有一些限制,例如,您不能将指向
D
的指针转换为指向
B
的指针

它是否符合您的要求主要取决于实际问题,所以我不能说。
无论如何,如果您有兴趣了解更多细节,这是一个可行的解决方案,在某种程度上类似于。Java中的“多重继承”不是真正的多重继承。因为Java只能通过使用接口来创建菱形问题

接口只是子类中已实现方法的引用,因为接口无法实现方法

因此,子类不能有具有不同实现的父类。从哪个接口继承方法并不重要,因为不存在任何实现

编辑:噢,我忘了Java是如何通过引入
默认
方法来破坏接口背后的原则的

但我不明白为什么会这样。在C++实现错误中,java如何使用多个接口继承??? 这是可能的,因为Java不允许多重继承,而只允许来自多个接口的多重实现

实现不同于继承

多重继承的一般问题是(简而言之)两个类可能定义做同一件事的不同方式,而子类不能选择哪一种

由于java中的接口只能声明方法的签名,而不能实现它们,因此如果派生多个接口,则不存在问题

总之,为了避免这个问题,Java禁止直接多重继承,只允许接口的多重实现


<>是否有一种方法来代替C++中的多重继承,以避免实现问题??? 我能给你的第一个建议是避免设计如此复杂

无论如何,你在问题中暴露的问题是非常常见的,被称为

C++提供了一个解决方案,以解决使用
虚拟继承时出现的问题

让一个继承图:

    A
 /     \
B       C
 \     /
    D
这就是问题所在:

默认情况下,C++分别遵循每个继承路径,因此
D
对象实际上将包含两个独立的
a
对象,并且必须正确限定a成员的使用

下面是关于
虚拟继承的简要说明:

如果继承从<代码> <代码> b>代码>,继承从<代码> a <代码> >代码> c>代码>都被标记为“虚”(例如,“代码>类B:虚拟公共A < /代码>”),C++特别注意<强>只创建一个代码> < <代码>对象< /强>,并且使用<代码> A<代码>成员正确工作。如果虚拟继承和非虚拟继承是混合的,则

a
的每个非虚拟继承路径都有一个虚拟a和一个非虚拟a


简言之,使用
virtual
继承,可以防止类
A
在类
D
中重复,这不是Java单一继承吗?可能重复为什么在文本中逗号前加空格,而不是相反?@Tobias,从我读到的内容来看,它是类的单一继承,而不是接口的单一继承……您不能对数据成员产生钻石效应,因为接口不允许数据成员,只允许抽象方法。这只是部分回答了这个问题。OP要求提供多重继承的替代方案,如果可能的话。感谢替代方案的实现!!谢谢你的回答!!Java不能制造钻石问题。一个给定的方法只有一个实现。实际上,使用默认方法,您可能会产生问题:默认方法不好的原因有很多,这甚至不是最坏的。我认为计划是好的,执行是糟糕的。