其他分享
首页 > 其他分享> > C解决钻石问题

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