多重继承:Java与C++; 最近,在阅读了一些编程语言和实践书籍的文章后,提到java中的多接口继承不会遇到C++中的多类继承问题。
但我不明白为什么会这样。在C++实现错误中,java如何使用多个接口继承??< /p> <>是否有一种方法来代替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会
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不能制造钻石问题。一个给定的方法只有一个实现。实际上,使用默认方法,您可能会产生问题:默认方法不好的原因有很多,这甚至不是最坏的。我认为计划是好的,执行是糟糕的。