仅仅通过使用找到的第一个继承的声明,难道不能解决钻石问题吗?我的意思是,
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:刚刚更新了上面的实现,使其更像菱形。
答案 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 ++哲学中,您不仅限于一种范式或模式。您可以选择具有您选择的多重继承。