2

钻石问题不能通过使用找到的第一个继承声明来解决吗?我是说,

公共类 A {
    公共虚拟 int getInt();
};

公共类 B:公共 A {
    公共 int getInt() {返回 6;}
};

公共类 C:公共 A {
    公共 int getInt() {返回 7;}
};

公共类 D:公共 B,公共 C {};

for class D,因为B首先列出,我们不能默认(当它不明确时)使用B::getInt()ifD::getInt()被调用吗?PATH 环境变量在 UNIX 和其他操作系统中的工作方式;如果在 PATH 变量中的不同位置存在两个具有相同名称的事物,则默认情况下应使用第一个位置(除非另有限定)。

编辑:通过“第一个”继承声明找到我的意思是根据简单的从左到右深度优先顺序

编辑#2:刚刚更新了上面的实现,使其更像钻石。

4

2 回答 2

4

这是一个非常错误的解决方案。想想以下情况会发生什么:

public class A {
    public int getInt() {return 5;}
    public float getFloat() {return 5.0;}
};

public class B {
    public int getInt() {return 6;}
    public float getFloat() {return 6.0;}
};

public class C {
    public int getInt() {return 7;}
    public float getFloat() {return 7.0;}
};

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

假设一个人想要D::getInt返回 5,而另一位开发人员想要D::getFloat返回 7.0(因此,不同的函数解析为不同的祖先)。第二个开发人员将更改继承顺序,并且错误将在所有代码路径中蔓延,具体取决于getInt.

于 2011-07-15T08:28:10.913 回答
0

不是钻石问题。C++ 编译器对它的所有语法都是特定的,如果有任何歧义,它总是会抛出错误。

这里是你的A::getInt()B::getInt()C::getInt()你简单地调用时是模棱两可的d.getInt()

编辑

在您编辑的问题中,编译器仍然不会从继承中进行评估,因为某些程序员可能确实需要拥有A==> 1st viaclass B和 2nd via的不同副本class C。请注意,所谓的钻石问题是人类特有的问题。对于 C++ 编译器,它只是另一种模式。

在 C++ 哲学中,您不仅限于一种范式或模式。您可以选择拥有您所选择的多重继承。

于 2011-07-15T08:27:26.970 回答