C ++解决钻石问题

时间:2011-07-15 08:21:46

标签: c++ multiple-inheritance diamond-problem

仅仅通过使用找到的第一个继承的声明,难道不能解决钻石问题吗?我的意思是,

public class A {
    public virtual int getInt();
};

public class B : public A {
    public int getInt() {return 6;}
};

public class C : public A {
    public int getInt() {return 7;}
};

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

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

编辑:通过“第一次”继承的声明发现我的意思是按照简单的从左到右的深度优先顺序

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

2 个答案:

答案 0 :(得分: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生效。

答案 1 :(得分:0)

这是钻石问题。 C ++编译器特定于其所有语法,如果有任何歧义,它将始终抛出错误。

当您拨打A::getInt()时,B::getInt()C::getInt()d.getInt()不明确。

修改

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

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