[英]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 ++多重继承之间的区别(请参阅上面的第一个问题)以及是否有建议克服的方法一些多重继承问题(如上所述)。
但我不明白为什么会这样。 在C ++实现错误存在时,java如何能够使用多个接口继承?
这是可能的,因为Java不允许多重继承,而只允许多个接口的多个实现 。
实现与继承不同。
多重继承的一般问题是( 在本文中 )两个类可以定义不同的方法来做同样的事情,并且子类不能选择要选择的方法。
由于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和一个非虚拟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.