9

我已经看到很多例子说明了多重继承的危险。

该示例通常类似于 Class B 和 C 扩展 Class A , Cl​​ass D 扩展 B 和 C 。

B 和 C 都覆盖了 A 的方法,例如,equals();

然后当调用 D.equals(); 它不知道应该调用其父级中的哪一个

前提是 equals() 在 D 中没有被覆盖。

据我所知,这个例子中的 A 类不是多余的吗?如果我们从这个层次结构中删除A,只看B和C,如果B和C都有equals()方法,那么当D扩展B和C时,它仍然会有同样的问题,所以它不是真的吗?死亡三角?

我不确定我假设的内容是否会导致其他语言的编译时错误。

希望有人能为我澄清一下。

4

2 回答 2

2

你其实是对的,根本不需要A存在来展示多重继承的问题。

下面的代码(克雷格在评论中雄辩地把它称为​​“死亡的 V”)就足够了:

#include <iostream>

class xyzzy {
    public: virtual int get (void) { return 7; }
};

class plugh {
    public: virtual int get (void) { return 42; }
};

class twisty: public xyzzy, public plugh {
};

int main() {
    twisty passages;
    std::cout << passages.get() << '\n';
    return 0;
}

如果你尝试编译它,你会得到:

testprog.cpp: In function ‘int main()’:
testprog.cpp:16:24: error: request for member ‘get’ is ambiguous
testprog.cpp:8:14: error: candidates are: virtual int plugh::get()
testprog.cpp:4:14: error:                 virtual int xyzzy::get()

但是,请记住,您可以通过以下方式明确选择您想要的:

    std::cout << passages.plugh::get() << '\n';

这里有更多关于钻石问题的信息,包括为什么它实际上是一个不同的问题。

于 2013-05-15T06:08:11.277 回答
2

如果D extends B and Cand not 覆盖了equals()在 B 和 C 中实现的方法 ,则没有歧义 - D 可以使用B.equals()or C.equals()

另一方面,对于菱形结构,如果 D 调用A.equals()并且 B 和 C 都覆盖它,则您不知道应该调用哪个方法B.equals()C.equals().

于 2013-05-15T06:04:50.790 回答