问题标签 [diamond-problem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
7536 浏览

java - 从两个不同的接口调用相同的方法名称 - Java

Java不允许多重继承来保护钻石问题。它使用接口来解决这个问题。

那么使用接口的情况,比方说

当我们调用run()类中的方法时C,如何判断我们使用的是哪个接口呢?

0 投票
2 回答
67 浏览

c++ - 避免指定在菱形设计中调用的函数

我目前有一个钻石设计,我在这里看到了一个相关的问题

在那个问题中,我假设 B 类和 C 类是从 A 类虚继承的,所以在 D 类中,当我们需要调用虚函数时,我们需要指定需要调用哪个虚函数。

对于我的菱形设计,我有很多虚函数要重写,以便让这些函数被正确的 B 或 C 父类函数调用。

不好,需要做很多重复的工作,当我有子类时,你有没有更好的解决方案,以便我可以在 D 类中调用 B 的 foo() 但不重写上面的示例。

0 投票
2 回答
1195 浏览

c++ - 什么是多重再继承?

我将以下称为“多重再继承”:

  • 直接继承一个类一次,通过继承其一个或多个后代间接继承一次或多次
  • 通过继承一个类的两个或多个后代来间接继承一个类两次或多次

我想知道它是否存在以及如何明确地访问嵌入的子对象。

1.) [ Professional C++,第 2版] †</ sup > 声明可编译程序不能有一个类直接继承其直接父类和所述父类的父类。这是真的吗?

给定一个扩展的GrandParentand ,VC12 和 g++ 允许 a直接继承自两个and 。在 VC12 和 g++ 中,可以按如下方式定义这些类:ParentGrandParentGrandChildParentGrandParent

GrandParent声明一个int num数据成员。除了继承's之外,还Parent声明了自己的. 除了继承's 和's之外,还声明了自己的。numGrandParentnumGrandChildnumParentGrandParentnum

VC12 似乎允许全面明确的成员访问,但 g++ 仅在某些情况下允许它。

2.) 为什么 (a)gc.Parent::GrandParent::num在 g++ 中是模棱两可的,而 (b)gc.Parent::num不是?(a) 唯一地描述了它在继承树上的位置。gc只有 1Parent个子对象,它只有 1GrandParent个子对象,它只有 1 个num。对于 (b),gc有一个Parent,它有自己的num,但也GrandParent有另一个的子对象num

3.) 对于gc.GrandParent::num,似乎 VC12gcGrandParent后者的num. 我猜它是明确的原因是它是一个由 限定的名称查找,因此在 ' 范围内首先查找gc右侧的实体,并且最直接到' 的范围是直接继承的,而不是通过间接继承一个。我错了吗?.gcGrandParentgcParent

4.) 为什么gc.GrandParent::num对 g++ 不明确 gc.Parent::num?如果一个是模棱两可的,那么两者不应该同样模棱两可吗?对于先验,gc有两个GrandParents;对于后者,Parent有 2num秒。


†</sup>Gregoire, Marc R. 等人。专业 C++,第 2。印第安纳波利斯:威利出版社,2011 年。241. 打印。

0 投票
1 回答
417 浏览

python - Python 多重继承名称冲突

我对 python 中的名称冲突有疑问。如果我有类似的东西:

D.a将打印c,有什么方法可以B.aDor中检索A.a

0 投票
1 回答
136 浏览

c++ - C++ 标准:为什么定义了一些“命令”而没有定义?

  1. 拥有一个类,其成员的初始化顺序在构造函数中被强烈定义(可能允许成员之间的依赖关系,就像在这个问题中一样- 但我认为这更多是一个设计问题,我可以想象循环依赖关系)。
  2. 有一个函数调用,参数评估的顺序没有定义,我认为这是为了 C 兼容性。
  3. 我们对以下“可怕的钻石”问题有一个错误:

    编译器不知道选择哪个版本,顺序被定义为不明确的。为什么根本不使用此问题中定义的“从左到右的深度优先分辨率顺序” (答案令人信服),即选择 B 而不是 C?

那么为什么会有这些不同的方法呢?为什么对 1 有严格的顺序而不对 3 有严格的顺序?保持 1 未定义不是更简单吗?还是 2 简单地定义为从左到右?

0 投票
17 回答
143503 浏览

java - Java 多重继承

为了完全理解如何解决 Java 的多重继承问题,我有一个经典问题需要澄清。

可以说我有一个类,Animal它有子类BirdHorse我需要创建一个类Pegasus,它既是鸟又是BirdHorsePegasus

我认为这是经典的钻石问题。据我所知,解决这个问题的经典方法是制作Animal,BirdHorseclasses 接口并Pegasus从中实现。

我想知道是否有另一种方法可以解决我仍然可以为鸟和马创建对象的问题。如果有一种方法可以创造动物,那也很好,但不是必需的。

0 投票
2 回答
573 浏览

c++ - 为什么“虚拟”继承不是默认行为?

我理解从基类派生时使用 virtual 关键字的要求,以避免与菱形继承相关的歧义问题。

但是,我的问题是为什么在派生类时这不是 C++ 中的默认行为,无论是否存在钻石问题?

在不存在钻石继承的情况下使用“虚拟”关键字是否有任何“危害”?

0 投票
2 回答
323 浏览

c++ - 虚拟派生的多态类的大小

我很难理解以下课程的规模是什么?
我正在使用 MSVS 2008(VC 9.0 编译器)。我已经读过,如果我不声明虚函数(在下面的示例中),那么 D 类将包含 2 个额外的指针(1 个来自 B,另一个来自 C),它将指向 A 的共享实例。

但是在下面的情况下每个类的内存映射是什么(也有虚函数)?

输出:
A 类尺寸:8
B 类尺寸:20
C 类尺寸:20
D 类尺寸:32

在这里,如何计算 B、C 和 D 的大小?

编辑:以下是 /d1reportSingleClassLayoutXXX 编译器选项为每个类生成的内存映射:

vbase X 的 vtordisp 是什么意思?

0 投票
1 回答
48 浏览

c++ - 具有菱形结构的未解析外部符号

以下代码可以正常工作:

删除后/**/编译器会显示"'B_Combined': inherits 'A1_Impl::A1_Impl::a1' via dominance"警告。我想没关系,因为我希望 B_Combined 继承A1::a1in的实现A1_Impl(它是唯一的实现)。

但我也收到一条错误消息:

我对此有点困惑。为什么 A1_Impl 中的实现不起作用?从 B1 派生 B_Combined 应该只添加一个b1调用 in 实现的A1::a1新方法A1_Impl

0 投票
2 回答
569 浏览

python - Python2 __bases__ 和超级

在 Python 2.7 中,我试图重建从某个类E到 root的继承链A。如下所示,有一个菱形继承问题,但我对路径感兴趣,而不是路径,所以它应该可以工作。这是否是我应该做的事情(这种方式)是值得怀疑的,但现在我只想知道我误解了什么......

输出

D在那里做什么?它在呼唤

super(C, E())“A级”应该在哪里,对吧?如果第一行的 C 是 DI,那么(在某种程度上)可以理解,但在我看来,第二行绝对应该是 A。

有什么帮助吗?

编辑:我的理解是调用

将导致名称“A”,因为 C 的线性化是[C, A, object].

然而,这显然不是什么super(C, obj).name()意思。它仍然使用 obj 的完全线性化:([E, C, D, A, object]感谢@Martijn Pieters),它只是从(之后)C 开始。因此 D 在 A 之前。