首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多重继承:Java C++

多重继承:Java C++
EN

Stack Overflow用户
提问于 2016-09-08 21:16:35
回答 4查看 5.6K关注 0票数 5

最近,在阅读了编程语言和实践书中的一些文章后,人们提到,Java中的多接口继承并不像C++中的多类继承那样存在相同的问题。

但我不明白为什么会这样。在C++实现中存在错误时,java如何能够使用多接口继承??

是否有一种方法来替代C++中的多重继承以避免实现问题?

为了使最后一项声明更加具体,让我们说我们有:

代码语言:javascript
复制
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++多重继承之间的区别(请参阅上面的第一个问题),以及是否有一种方法建议克服一些多重继承问题(如上面所述)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-08 21:21:21

Java (与C++不同)不允许多重继承 of state,因此不受金刚石问题的影响。

它允许通过接口多继承类型的(类可以实现多个接口)。

从Java8开始,通过接口中的方法对行为进行多重继承。

票数 5
EN

Stack Overflow用户

发布于 2016-09-08 21:57:53

但我不明白为什么会这样。在C++实现中存在错误时,java如何能够使用多接口继承?

这是可能的,因为Java不允许多重继承,而只允许来自多个接口的多个实现。

实现与继承不同。

多重继承的一般问题是(在shor_t中),两个类可能定义_different执行相同事情的方式,而子类不能选择选择哪一个。

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

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

是否有一种在c++中替换多重继承以避免实现问题的方法?

我能给你的第一个建议是避免一个如此复杂的设计。

无论如何,您在问题中暴露的问题是非常常见的,称为金刚石问题

C++提供了一个解决方案,以便通过使用virtual inheritance来解决这个问题。

让一个继承图:

代码语言:javascript
复制
    A
 /     \
B       C
 \     /
    D

这就是问题所在:

默认情况下,C++分别跟踪每个继承路径,因此D对象实际上包含两个独立的A对象,并且必须对A的成员的使用进行适当限定。

这是对virtual继承的简要解释:

如果从AB的继承和从AC的继承都标记为“虚拟”(例如"class B : virtual public A"),C++特别注意只创建一个对象,并且使用A的成员正确工作。如果虚拟继承和非虚拟继承混合在一起,则对于A的每个非虚拟继承路径都有一个单独的虚拟A和一个非虚拟A。

简而言之,使用virtual继承,可以防止部件类A在类D中重复。

票数 3
EN

Stack Overflow用户

发布于 2016-09-08 21:22:40

为了避免这种情况,我们可以在没有多重继承的情况下编写上面的代码,但结果类似吗?

下面是一个最小的工作示例:

代码语言:javascript
复制
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的指针。

如果它符合您的要求,主要取决于真正的问题,所以我不能说。

无论如何,这是一个可行的解决方案,在某种程度上类似于内类成语,如果您对进一步的细节感兴趣的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39400343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档