【发布时间】:2010-01-14 14:46:53
【问题描述】:
关于钻石问题的维基百科:
"...菱形问题是当两个类 B 和 C 继承自 A,而类 D 继承自 B 和 C 时出现的歧义。如果 D 中的方法调用 A 中定义的方法(并且没有重写方法),而 B 和 C 以不同的方式重写了该方法,那么它从哪个类继承:B 还是 C?”
所以钻石看起来像这样:
A
/ \
B C
\ /
D
我的问题是,如果没有这样的类 A 会发生什么,但 B 和 C 又声明了相同的方法,比如 foo()。这不是同样的问题吗?那为什么叫钻石问题呢?
例子:
class B {
public void foo() {...}
}
class C {
public void foo() {...}
}
class D extends B, C {
}
new D().foo();
【问题讨论】:
-
你问的是什么语言?
-
@Neil Butterworth 语言在此无关紧要,因为这更像是一个概念问题。 C++ 等语言允许这样做,但 Java 和 C# 不允许。
-
这就是为什么“多重继承”是一个肮脏的词......
-
简而言之:“三角形”只能在编译时失败(并且可以通过在调用站点更明确地修复),但“菱形”可能在运行时失败,因为
A* a = new D();后跟a->foo();。
标签: oop inheritance diamond-problem