问题标签 [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 投票
2 回答
579 浏览

c++ - c++中没有虚函数的多重继承

我遇到了钻石问题,并为单个钻石的不同情况找到了不同的解决方案。但是我找不到“链式”钻石的解决方案。

根据结构:是的,我希望每次都有多个基类,所以虚拟继承不是一个解决方案(它甚至被称为钻石吗?)。我还想避免对钻石的每个中间层使用 get/set-functions。

在父类中访问 val 现在的工作方式如下:

但是下一个“链式”钻石呢:

通过以下方式访问 val:

结果是:

为什么?通向价值的途径不是很明确吗?

0 投票
4 回答
1606 浏览

c++ - 菱形多态继承:sizeof 大部分派生类

我知道菱形继承会导致歧义,可以通过使用继承来避免virtual Base Classes,问题不在于它。当类是多态的时,问题是关于菱形层次结构中最派生类的大小。这是示例代码和示例输出:

我得到的输出是:

据我了解Base,它包含一个虚拟成员函数,因此
在此环境中 sizeof Base = vptr 的大小 = 4

类似的是案例Derived1Derived2课程。

这是我与上述场景相关的问题:类对象
的大小如何Derived3,这是否意味着 Derived3 类有 2 个 vptr?
该类如何Derived3与这 2 个 vptr 一起工作,关于它使用的机制有什么想法吗?
类的大小保留为编译器的实现细节而不由标准定义(因为虚拟机制本身是编译器的实现细节)?

0 投票
2 回答
397 浏览

prolog - Flora-2 钻石传承

Flora-2 是一种古怪的语言,我知道这是一个很长的尝试,但我还没有找到任何致力于它的活跃资源,所以我在这里尝试。它如此受欢迎......它没有stackoverflow标签。如果您对 Flora-2 和 XSB Prolog 的状态和未来有所了解,我也很想听听

有人可以向我解释 Flora-2 钻石继承规则吗?该手册有一个示例,但没有显示示例的结果。措辞似乎与我在解释器和 diamond.flr 演示中看到的相反。这是演示:

(无论有没有基类 c,我看到的都会发生)

手册说:

在 arity > 1 的方法级别,如果有两个未覆盖的相同方法的定义附加到两个不同的超类,则认为发生了冲突。在决定是否发生冲突时,我们忽略方法的参数。例如,在

即使在一种情况下将方法 m 应用于对象 k,而在另一种情况下将方法应用于对象 u,也会发生多重继承冲突。

(我很确定他们的意思是 arity >= 1 但结果对于 arity 2 也是相似的)

所以我认为这意味着 f 的继承存在冲突,因此它是未定义的(尽管我对“未定义”的含义有些困惑,但在相关部分中它说“没有发生继承”)。这是我运行钻石时得到的结果:

我只期望第一个解决方案,尽管我认为如果第二个解决方案也有解决方案,它至少会有意义

......但它没有。

仅供参考,我正在使用最新的稳定 XSB 和最新的 Flora-2 版本... 0.95。

0 投票
2 回答
1284 浏览

c++ - C++ 多重继承 - 为什么你不工作?

我试图找出一个有趣的多重继承问题。

祖父母是一个具有多种方法的接口类:

然后是部分完成这个接口的抽象类。

我要使用的类继承自两个父类,并通过 using 指令指定应该来自哪里的方法:

当我尝试实例化 DI 时,尝试实例化抽象类时会出错。

有人可以帮助我理解问题以及如何最好地利用部分实现吗?

0 投票
7 回答
661 浏览

c++ - 关于 C++ 中的多继承的问题?

我有以下代码:

执行时,程序给出结果:

我不明白。为什么 和 中的地址Line 1Line 2不同Line 3,而 Student 和 Staff 都从 Person 继承名称?

0 投票
2 回答
2076 浏览

c++ - 钻石层次结构中的低落

为什么static_cast不能从虚拟基地垂头丧气?

g++ 4.5 说:

解决方案是使用dynamic_cast? 但为什么。什么是理性?

-- 编辑 --
下面很好的答案。没有答案详细说明子对象和 vtables 最终是如何被订购的。以下文章为 gcc 提供了一些很好的示例:
http ://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting

0 投票
3 回答
410 浏览

c++ - 为什么单一虚拟继承不足以解决可怕的钻石问题?

在上面编码之后,编译器仍然D2要求virtual

我不明白的是,一旦您提示了与(via ) 相关的编译B器,那么为什么它仍然是模棱两可的?virtualDDD1i

(如果我没记错的话,较旧的 VC++(2006 年)足以通过单virtual继承来解决这个问题)

0 投票
2 回答
3040 浏览

c++ - C++ 解决钻石问题

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

for class D,因为B首先列出,我们不能默认(当它不明确时)使用B::getInt()ifD::getInt()被调用吗?PATH 环境变量在 UNIX 和其他操作系统中的工作方式;如果在 PATH 变量中的不同位置存在两个具有相同名称的事物,则默认情况下应使用第一个位置(除非另有限定)。

编辑:通过“第一个”继承声明找到我的意思是根据简单的从左到右深度优先顺序

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

0 投票
2 回答
923 浏览

java - 有办法用Java模拟钻石问题

有办法用 Java模拟钻石问题吗?带接口?

谢谢, 塞尔索

0 投票
1 回答
17540 浏览

c++ - 通过优势警告进行 C++ 继承

我正在尝试实现一个实现许多接口的相当大的对象。其中一些接口是纯虚拟的。我可能在钻石继承上有问题。Visual Studio 报告C4250 ('class1' : inherits 'class2::member' via dominance). 首先,这些类实际上是按应有的方式继承的。以下是导致此问题的部分类设计。

在这整个树中,只有 D 实现了虚拟方法,没有其他方法定义问题。B 的所有虚方法都列在警告中。如果重要,D 是一个完整的类。

我读到 Boost 序列化会发生这种情况,忽略警告是安全的。

我试图实现的这种方法有效吗?忽略此警告是否安全?

注意 1:这不是Visual Studio 编译器警告 C4250 ('class1' : inherits 'class2::member' via dominance)的副本,我已经尝试了那里提出的解决方案。

注2:我也可以发送类图,但它比这复杂一点。

编辑: 完整警告如下:

gge::resource::ImageResource图中是 Big,gge::graphics::ImageTexture是 D,drawin 是我收到警告的六种方法之一。