C解决钻石问题
作者:互联网
仅使用找到的第一个继承的声明就不能解决钻石问题吗?我的意思是,
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 {};
对于类D,由于B列在最前面,所以如果调用D :: getInt(),我们是否不能默认使用B :: getInt()? PATH环境变量在UNIX和其他OS上的工作方式;如果在PATH变量的不同位置有两个名称相同的事物,则默认情况下应使用第一个位置(除非另有限定).
编辑:通过“第一个”继承的声明找到我的意思是根据简单的从左到右的深度优先顺序
编辑#2:刚刚更新了上面的实现,使其更像钻石.
解决方法:
这是一个非常有问题的解决方案.想想在以下情况下会发生什么:
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的所有代码路径中都会出现一个bug.
标签:diamond-problem,c,multiple-inheritance 来源: https://codeday.me/bug/20191011/1892624.html