最近,在阅读了编程语言和实践书中的一些文章后,人们提到,Java中的多接口继承并不像C++中的多类继承那样存在相同的问题。
但我不明白为什么会这样。在C++实现中存在错误时,java如何能够使用多接口继承??
是否有一种方法来替代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继承的) .To会避免这样的情况--我们可以在没有多重继承的情况下编写上面的代码,但是结果相似吗?
这个问题不是重复的,因为它没有关注示例中最终将是什么继承,而是要理解Java++多重继承之间的区别(请参阅上面的第一个问题),以及是否有一种方法建议克服一些多重继承问题(如上面所述)。
发布于 2016-09-08 21:21:21
发布于 2016-09-08 21:57:53
但我不明白为什么会这样。在C++实现中存在错误时,java如何能够使用多接口继承?
这是可能的,因为Java不允许多重继承,而只允许来自多个接口的多个实现。
实现与继承不同。
多重继承的一般问题是(在shor_t中),两个类可能定义_different执行相同事情的方式,而子类不能选择选择哪一个。
由于java中的接口只能声明方法的签名而不实现它们,因此如果派生出多个接口,则不存在此问题。
总之,为了避免这个问题,Java禁止直接多重继承,并且只允许多个接口的实现。
是否有一种在c++中替换多重继承以避免实现问题的方法?
我能给你的第一个建议是避免一个如此复杂的设计。
无论如何,您在问题中暴露的问题是非常常见的,称为金刚石问题。
C++提供了一个解决方案,以便通过使用virtual inheritance来解决这个问题。
让一个继承图:
A
/ \
B C
\ /
D这就是问题所在:
默认情况下,C++分别跟踪每个继承路径,因此
D对象实际上包含两个独立的A对象,并且必须对A的成员的使用进行适当限定。
这是对virtual继承的简要解释:
如果从
A到B的继承和从A到C的继承都标记为“虚拟”(例如"class B : virtual public A"),C++特别注意只创建一个对象,并且使用A的成员正确工作。如果虚拟继承和非虚拟继承混合在一起,则对于A的每个非虚拟继承路径都有一个单独的虚拟A和一个非虚拟A。
简而言之,使用virtual继承,可以防止部件类A在类D中重复。
发布于 2016-09-08 21:22:40
为了避免这种情况,我们可以在没有多重继承的情况下编写上面的代码,但结果类似吗?
下面是一个最小的工作示例:
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);
}如果您不想创建显式层次结构,但仍然希望在需要引用D的情况下使用B实例,那么上面的解决方案工作得很好。
正如你所看到的,它是基于组合而不是继承的。
当然,它有一些限制,例如,您不能将指向D的指针转换为指向B的指针。
如果它符合您的要求,主要取决于真正的问题,所以我不能说。
无论如何,这是一个可行的解决方案,在某种程度上类似于内类成语,如果您对进一步的细节感兴趣的话。
https://stackoverflow.com/questions/39400343
复制相似问题