问题标签 [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.
c++ - c++中没有虚函数的多重继承
我遇到了钻石问题,并为单个钻石的不同情况找到了不同的解决方案。但是我找不到“链式”钻石的解决方案。
根据结构:是的,我希望每次都有多个基类,所以虚拟继承不是一个解决方案(它甚至被称为钻石吗?)。我还想避免对钻石的每个中间层使用 get/set-functions。
在父类中访问 val 现在的工作方式如下:
但是下一个“链式”钻石呢:
通过以下方式访问 val:
结果是:
为什么?通向价值的途径不是很明确吗?
c++ - 菱形多态继承:sizeof 大部分派生类
我知道菱形继承会导致歧义,可以通过使用继承来避免virtual Base Classes
,问题不在于它。当类是多态的时,问题是关于菱形层次结构中最派生类的大小。这是示例代码和示例输出:
我得到的输出是:
据我了解Base
,它包含一个虚拟成员函数,因此
在此环境中 sizeof Base = vptr 的大小 = 4
类似的是案例Derived1
和Derived2
课程。
这是我与上述场景相关的问题:类对象
的大小如何Derived3
,这是否意味着 Derived3 类有 2 个 vptr?
该类如何Derived3
与这 2 个 vptr 一起工作,关于它使用的机制有什么想法吗?
类的大小保留为编译器的实现细节而不由标准定义(因为虚拟机制本身是编译器的实现细节)?
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。
c++ - C++ 多重继承 - 为什么你不工作?
我试图找出一个有趣的多重继承问题。
祖父母是一个具有多种方法的接口类:
然后是部分完成这个接口的抽象类。
我要使用的类继承自两个父类,并通过 using 指令指定应该来自哪里的方法:
当我尝试实例化 DI 时,尝试实例化抽象类时会出错。
有人可以帮助我理解问题以及如何最好地利用部分实现吗?
c++ - 关于 C++ 中的多继承的问题?
我有以下代码:
执行时,程序给出结果:
我不明白。为什么 和 中的地址Line 1
与Line 2
不同Line 3
,而 Student 和 Staff 都从 Person 继承名称?
c++ - 钻石层次结构中的低落
为什么static_cast
不能从虚拟基地垂头丧气?
g++ 4.5 说:
解决方案是使用dynamic_cast
? 但为什么。什么是理性?
-- 编辑 --
下面很好的答案。没有答案详细说明子对象和 vtables 最终是如何被订购的。以下文章为 gcc 提供了一些很好的示例:
http ://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting
c++ - 为什么单一虚拟继承不足以解决可怕的钻石问题?
在上面编码之后,编译器仍然D2
要求virtual
:
我不明白的是,一旦您提示了与(via ) 相关的编译B
器,那么为什么它仍然是模棱两可的?virtual
DD
D1
i
(如果我没记错的话,较旧的 VC++(2006 年)足以通过单virtual
继承来解决这个问题)
c++ - C++ 解决钻石问题
钻石问题不能通过使用找到的第一个继承声明来解决吗?我是说,
for class D
,因为B
首先列出,我们不能默认(当它不明确时)使用B::getInt()
ifD::getInt()
被调用吗?PATH 环境变量在 UNIX 和其他操作系统中的工作方式;如果在 PATH 变量中的不同位置存在两个具有相同名称的事物,则默认情况下应使用第一个位置(除非另有限定)。
编辑:通过“第一个”继承声明找到我的意思是根据简单的从左到右深度优先顺序
编辑#2:刚刚更新了上面的实现,使其更像钻石。
java - 有办法用Java模拟钻石问题
有办法用 Java模拟钻石问题吗?带接口?
谢谢, 塞尔索
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 是我收到警告的六种方法之一。