C++ C++;解决钻石问题

C++ C++;解决钻石问题,c++,multiple-inheritance,diamond-problem,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, pub

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

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 {}; 公共A类{ 公共虚拟int getInt(); }; 公共B类:公共A类{ public int getInt(){return 6;} }; 公共C类:公共A类{ public int getInt(){return 7;} }; 公共类D:公共B,公共C{}; 对于
类D
,由于
B
列在第一位,如果调用
D::getInt()
,我们是否可以在默认情况下使用
B::getInt()
?PATH环境变量在UNIX和其他操作系统中的工作方式;如果路径变量中的不同位置存在同名的两个对象,则默认情况下应使用第一个位置(除非另有限定)

编辑:我所说的“第一个”继承声明是指根据简单的从左到右的深度顺序找到的


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

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

这里,当您仅调用
d.getInt()
时,您的
A::getInt()
B::getInt()
C::getInt()
是不明确的

编辑

在您编辑的问题中,编译器仍然不会从继承中求值,因为有些程序员可能确实需要不同的
A
==>1st via
class B
和2nd via
class C
副本。请注意,所谓的钻石问题是以人类为特征的问题。对于C++编译器来说,它只是一个模式。
在C++哲学中,你不局限于一种范式或模式。您可以选择多重继承。

这是一个非常有缺陷的解决方案。想想在以下情况下会发生什么:

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将在所有代码路径中爬行。这里没有菱形问题,看起来像是普通的旧多重继承。此外,如果有人意外地将顺序更改为
B
a
C
?或者在其他类中使用该顺序派生-这是非常脆弱的..这里的根本问题不是A中的任何虚拟成员都可能在B或C中有不同的实现,并且无法解决D中的这些差异,因为这几乎需要编译器确切地知道您想要做什么(这将违背程序员的目的)。通过任意猜测程序员的意思来解决歧义可能会导致代码的行为与程序员的预期不符。强制程序员明确声明预期行为会减少出错的空间。是的,但如果特定开发组采用“铁的编码实践”:“永远不要改变继承类的顺序!(一旦指定了它们)“?即使始终遵循此规则,是否也会出现边缘情况?这是不可执行的。有一天,在拼命修复分配给他的错误时,开发人员会这样做。而现在,在最后期限的前夕,他将有两个错误。因此,除了人类之外!=ironclads(@Nim,确实如此!),默认的从左到右深度优先分辨率应该可以正常工作?不,您可以使用两种或两种以上的方法。其中一些方法可能需要其他分辨率顺序,但不会从左到右深度优先分辨率顺序明确地解析所涉及的方法?另外,如果有人特别想要不同的分辨率顺序,难道他们不能(用超类名)限定要调用的方法吗?