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

c++ - 虚拟继承如何解决“钻石”(多重继承)的歧义?

我了解钻石问题,上面的代码没有这个问题。

虚拟继承究竟是如何解决这个问题的?

我的理解: 当我说A *a = new D();时,编译器想知道一个类型的对象是否D可以分配给一个类型的指针A,但是它有两条路径可以遵循,但不能自行决定。

那么,虚拟继承如何解决这个问题(帮助编译器做出决定)?

0 投票
4 回答
5255 浏览

c++ - 具有相同名称的 C++ 虚拟覆盖函数

我有类似的东西(简化)

如何实现 A 的 Function () 和 B 的 Function() ?Visual C++ 只允许您定义特定的内联函数(即不在cpp 文件中),但我想它是一个扩展。GCC 对此抱怨。有没有标准的 C++ 方法来告诉编译器我要覆盖哪个函数?

(视觉 C++ 2008)

谢谢!

0 投票
2 回答
660 浏览

c++ - 钻石子问题:侧分支中的非多重继承仍然需要类构造函数

当我尝试以通常的方式“解决”通常的钻石问题时出现了奇怪的问题 - 使用虚拟继承:

但是我的基类 A 没有默认构造函数,所以我要从 D 手动调用它。但是,当我尝试将类 E 添加到这个菱形中作为 C 继承时

仍然需要在E构造函数中手动调用A的构造函数,即C不会从E创建A,即使没有多重继承也没有菱形ACE。

是否可以在不从 E 调用 A 的构造函数的情况下解决此问题?我需要 C 来正确地做到这一点:-)。

或者是否有可能根本不尝试解决钻石问题:

并且仍然尝试用 A 的两个实例声明 D 类的对象,但每次从 D 收集时告诉编译器使用 C 的 A?当我尝试添加

进入 D 的声明它仍然会产生明确基数 A 的错误。

0 投票
6 回答
10094 浏览

c++ - C++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象

我目前正致力于在非 RTTI 平台 (Android) 上集成使用大量 RTTI 内容的第三方包。基本上,我做了自己的 RTTI 实现,但我遇到了一个问题。

问题是很多类都有菱形继承问题,因为所有类都派生自同一个基类(对象)。所以,如果我想从基类向下转换为派生类,我必须使用dynamic_cast - 但 RTTI 不可用!当有没有dynamic_cast的虚拟继承时,如何将对象从父对象转换为子对象?

它看起来像这样:

这些是我的错误:

错误 C2635:无法将“A*”转换为“D*”;隐含从虚拟基类的转换

错误 C2440:“正在初始化”:无法从“test_convert::A *”转换为“test_convert::D *”从基础转换为派生需要 dynamic_cast 或 static_cast

有任何想法吗?

0 投票
3 回答
886 浏览

c++ - C++ 奇怪的钻石继承问题

我有这个

A 有一个纯虚函数,原型为:

B 和 C 实际上继承自 A ( class B: public virtual A, class C: public virtual A)

B 具有虚函数,原型为:

C具有虚函数,原型为:

D 像这样从 B 和 C 继承:class D: public B, public C D 具有虚函数,原型为:

现在,编译时出现以下 6 行错误:

不知道如何解决这个问题。

提前致谢。

0 投票
3 回答
769 浏览

c++ - 如何确保虚拟基类上的赋值运算符只被调用一次?

我在典型的菱形问题中使用虚拟继承:

我在每个类中都实现了一个名为“deep_copy_from”的方法(但它也可以是赋值运算符=())。该方法应该复制类自己的属性,并将副本传播到上面的类。

问题是 A::deep_copy_from 方法在我深度复制 D 实例时被调用了两次(它应该只被调用一次,因为 A 只有一个“版本”)。确保它只被调用一次的最佳方法是什么?

(B::deep_copy_from 和 C::deep_copy_from 应该继续以相同的方式工作)。

这是一个示例代码:

这是当前的输出:

更新:

现在的版本是:

输出是:

我能得到比这更好的吗?(即,更自动)

0 投票
6 回答
3965 浏览

python - 在 Python 中使用 MixIns 时出现菱形问题

请考虑以下代码实现一个简单的MixIn

运行main导致如下错误:

问题是StoryStoryHTMLMixin都源自object,于是钻石问题就出现了。

解决方案是简单地制作StoryHTMLMixin一个旧式类,即删除继承自object,因此,将类的定义更改StoryHTMLMixin为:

运行时导致以下结果main

我不喜欢使用旧式类,所以我的问题是:

这是在 Python 中处理此问题的正确方法,还是有更好的方法?

编辑:

我看到最新的 Python 源代码UserDict中的类定义了一个使用旧样式类的 MixIn(如我的示例中所示)。

正如所有人的建议,我可能会在不使用 MixIns 的情况下重新定义我想要获得的功能(即在运行时绑定方法)。然而,重点仍然存在——这是唯一一个在不求助于重新实现或回退到旧式类的情况下无法解决 MRO 的用例吗?

0 投票
3 回答
1540 浏览

c++ - 接口的钻石问题

我正在使用许多抽象类,它们只定义纯虚函数和一个虚拟(非纯)析构函数。

不使用虚拟继承的菱形继承结构还可以吗?(我想确保即使某些程序员不知道他应该使用虚拟继承也不会出现问题。)有什么好的资源可以简短而完整地概述这个主题?

谢谢!

0 投票
4 回答
788 浏览

c++ - C++ / Diamond 继承 / 静态变量

我面临一些设计问题,我想写:

我认为按照 C 类的定义,我不会有任何问题.. 但是当我定义 D 类时会发生什么?由于 D 将从 B 和 C 继承,我可能会有一些模棱两可的东西。我的最终目标是在每个类 B、C 和 D 中都有一个名称相同但值不同的静态变量。那可能吗?

非常感谢提前

0 投票
1 回答
287 浏览

c++ - 使用第三方库的菱形继承问题

我似乎找到了一个我应该遭受“可怕的”钻石继承问题的案例。但是,代码似乎工作得很好。我似乎无法确定的是是否存在问题。

这是设置。我正在使用 MFC 并扩展了 CEdit 以添加对鼠标单击窗口消息的自定义处理。然后我继承了这个类和一个第三方开发者编写的类(在这个例子中叫他 Bob)。这样做,我现在可以返回我的特殊控件或 Bob 控件的增强版本。问题是,Bob 的库无法修改,我们的代码最终都继承自 CEdit(以及 CWnd)。

示例代码:

所以......问题是:

  1. 为什么这似乎没有受到钻石继承问题的困扰?
  2. 这个设计有没有我看不到的问题,将来会咬我?
  3. 如果我不能修改菱形一侧的代码(即我不能在两侧声明 CEdit 虚拟?),是否有另一种方法来解决这个问题

谢谢!