繁体   English   中英

多重继承:Java与C ++

[英]Multiple Inheritance :Java vs C++

最近,在阅读了“编程语言与实践”一书中的一些文章之后,提到Java中的多个接口继承不会遇到与C ++中的多类继承相同的问题。

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

有没有办法在C ++中替换多继承以避免实现问题?

对于最后一个更具体的陈述,我们说:

class A {...};
class B : public A {...};
class C : public A {...};
class D : public B, public C {...};

然后D类继承继承A类的B,C类。所以如果A有一个字段变量,那么B,C将具有相同的变量名,那么D将具有什么变量(继承自B或C)。为了避免这种情况我们可以编写上面的代码而没有多重继承,但结果相似吗?

问题不是重复,因为它没有关注最终将是示例中的继承,而是要了解Java-C ++多重继承之间的区别(请参阅上面的第一个问题)以及是否有建议克服的方法一些多重继承问题(如上所述)。

Java(与C ++不同)不允许多重继承 状态 ,因此不会受到钻石问题的影响

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

从Java 8开始,通过接口中的default方法还存在多个行为继承。

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

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

实现继承不同。

多重继承的一般问题是( 在本文中 )两个类可以定义不同的方法来做同样的事情,并且子类不能选择要选择的方法。

由于java中的 接口 只能在不实现方法的情况下声明方法的签名,因此如果派生了多个接口,则该问题不存在。

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


有没有办法在c ++中替换多继承,以避免实现问题?

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

无论如何,你在问题中暴露的问题非常普遍,被称为钻石问题

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

让一个继承图:

    A
 /     \
B       C
 \     /
    D

这就是问题:

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

这是关于virtual继承的简要说明:

如果从AB的继承和从AC的继承都标记为“虚拟”(例如,“ class B : virtual public A ”),则C ++需要特别注意只创建一个A对象 ,并使用A '的成员工作正常。 如果混合了虚拟继承和非虚拟继承,则每个到A非虚拟继承路径都有一个虚拟A和一个非虚拟A.

总之,随着virtual继承可以防止部分类A是类重复D

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

它遵循一个最小的工作示例:

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的指针。

如果它符合您的要求主要取决于真正的问题,所以我不能说。
无论如何,如果您对进一步的细节感兴趣,这是一个可行的解决方案,类似于内部类成语

Java中的“多重继承”并不是真正的多重继承。 由于Java只能通过使用接口来创建钻石问题。

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

因此,子类不能让父母具有不同的实现。 从继承该方法的接口无关紧要,因为不存在实现。

编辑 :哦,我忘了Java如何通过引入default方法来破坏接口背后的原理......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM