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

c++ - 支配继承——真的很糟糕吗?

我是那些必须让他们的代码以 0 个警告编译的人之一。通常我尊重编译器,如果它向我发出警告,我认为它是我应该稍微修改我的代码的标志。如果我必须告诉编译器忽略给定的警告,我会抽搐一下。

但是这个我似乎无法解决,据我所知,我没有做任何“坏”的事情。有人认为这是一个糟糕的设计吗?我看不出它有什么特别令人讨厌的地方(“邪恶的钻石”除外),但它是完全有效且有用的代码。但它会生成(在 MSVC 中)2 级警告!

现在,如果我创建一个 Quux 对象,它应该会调用 Bar::foo 实现。MSVC 非常有帮助:它警告我不够模棱两可?

警告 C4250: 'Quux' : 通过支配继承 'Bar::Bar::foo'

现在我认识到我可以用编译指示关闭这个警告,但这不是我想在这里问的问题。有什么理由我应该在这里听编译器,还是这只是一个非常过分热心的警告?

0 投票
3 回答
2813 浏览

c++ - 编译器如何在内部解决 C++ 中的菱形问题?

我们知道我们可以使用虚拟继承来解决菱形问题。

例如:

当我们编译这段代码时,我们会得到一个歧义错误。现在我的问题是编译器如何在内部检测到这种歧义问题(菱形问题)。

0 投票
3 回答
11547 浏览

c++ - 多重继承和纯虚函数

以下代码:

编译失败,出现以下错误:

我已经玩过它并发现使“接口 - > interface_base”和“implementation_base - > interface_base”继承虚拟化可以解决问题,但我不明白为什么。有人可以解释发生了什么吗?

ps 我故意省略了虚拟析构函数以使代码更短。请不要告诉我把它们放进去,我已经知道了:)

0 投票
1 回答
95 浏览

c++ - C++:钻石问题

简单的问题:这种层次结构会导致 DP 吗?

0 投票
1 回答
681 浏览

c++ - 带有混合继承修饰符的菱形继承(受保护/私有/公共)

假设我们有class A,B,C,DA 是基础,B,C 介于两者之间,D 是在钻石模型中派生的。

笔记:

class Bclass A私有模式继承 virtualy ,

class Cclass A保护模式下继承虚拟。

现在当我们做一个成员的实例时,class D那会是什么?私人或受保护的大声笑?

图二:

如果我们这样做会怎样:

我想member在第二个例子中会是公开的,是吗?

0 投票
4 回答
252 浏览

c++ - 虚拟基类子对象的多个实例(真的)——不可能吗?

给定代码:

我们可以让第二个断言失败吗?

换句话说,当我们有一个双菱形继承图并希望在派生最多的对象中为两个菱形的顶部有单独的子对象时,就是这种情况。

标准 (2003, 10.1.4) 的措辞似乎禁止这样做,如果确实如此,那么后续问题是:我们是否没有提供精确的虚拟多乘包含子对象结构操作的方法,为什么?

0 投票
5 回答
3815 浏览

java - 即将发布的 Java 8 版本中的虚拟扩展方法

当我看到像这样的代码片段时

我有一个问题。我们还没有在 Java 中得到足够的 sh*t 吗?为什么一个人可能需要这个?

0 投票
1 回答
1233 浏览

c++ - 菱形多重继承模式

下面是多重继承中面临的一个菱形问题,

我得到的输出是

  1. 空基构造函数
  2. Derived2 一个 arg 构造函数
  3. Derived1 一个 arg 构造函数
  4. 派生构造函数
  5. 空派生析构函数
  6. 空 Derived2 析构函数
  7. 空 Derived1 析构函数
  8. 空基析构函数

我想知道为什么我的 derObj 参数(即“如果可以打印”)没有打印出来,输出也不像

  1. 空基构造函数
  2. Derived2 一个 arg 构造函数
  3. 如果可以的话,打印这个!
  4. Derived1 一个 arg 构造函数
  5. 派生构造函数
  6. 空派生析构函数
  7. 空 Derived2 析构函数
  8. 空 Derived1 析构函数
  9. 空基析构函数
0 投票
2 回答
513 浏览

python - 在 python 和 super 中具有相同成员的类的菱形继承

我发现自己处于菱形继承的奇怪情况,更糟糕的是菱形中间的类共享一个成员。下面我展示了一段精简的代码,突出了我的问题。

我在编写类时使用的方法是从http://rhettinger.wordpress.com/2011/05/26/super-considered-super/中学到的,它链接在 python 文档站点上,用于内置函数super

给出输出

问题是使用关键字参数来确保函数签名匹配的方法从类 C 的 init 调用中删除了 z 参数。我可以强制将参数添加回 kwargs(请参阅注释代码),但这会导致我无法实例化 B 类型的对象,因为这将导致调用不带参数的对象的 init,这是一个不错的功能,因为它可以防止我在实例化以下任何对象时输入无效参数。

我还注意到,如果我在设置变量之前有 super 行,那么问题就解决了,因为最高级别的对象将覆盖较低的级别。然而,我的代码大量构建在最后,因为所有实际的“设置”都是由低级类执行的,而更高级别的类将值传递到继承链中。是否有关于在哪里适合家长电话的指南?

任何想法Stackoverflow?

谢谢

ps 这只是“合作课程”的糟糕设计吗?究竟什么是合作课程?是否有应该遵循的规则或指导方针?

编辑:

Stackoverflow 不会让我回答我自己的问题,但我想出了一个解决方案。

我认为合作班级之间不应该有任何共享成员。如果有两个彼此独立的类(在某种意义上没有“是一种”关系)共享一个成员,那么您应该在继承关系中添加一个抽象级别。

共享成员应该被取出并放入一个单独的类中,该类继承自共享基类,并由菱形中的类继承。

以下是更正后的代码。为了与 OP 中的链接保持一致,我引入了一个 Root 基类

我应该指出我没有接受过正式的编程教育(就像我猜的大多数人一样),所以如果我使用了错误的术语,我深表歉意。

0 投票
2 回答
3747 浏览

c++ - 虚拟继承和可怕的钻石

我很难解决可怕的钻石问题。提醒一下,这里是这个问题的经典类层次结构:

为了解决这个问题,标准的解决方案是让 C1 和 C2 使用虚拟继承从 B 继承。

我的问题是 B 和 C1 来自我无法修改的 SDK。 下面的示例我无法让SubClassB虚拟地从Base继承。类:PureVirtualBase、Base 和 SubClassB 来自我使用的 SDK。我无法修改它们。SubClassA 和 Leaf 是我的自定义类。我可以改变它们。

在这种情况下,无法将SubClassB更改为使用来自Base的虚拟继承。应该怎么做:

  • Leaf实例只包含一个Base
  • 在尝试访问在PureVirtualBase中定义的纯虚拟函数并在Base中实现时避免歧义
  • 如果我评论对 f_PurevirtualBase 的调用,它会编译,但我有一个警告, 由于模棱两可,'Leaf' 中的虚拟基础'Base' 不可访问如果我取消注释此调用:我收到此错误:对成员'f_PureVirtualBase' 的请求不明确
  • 如果我在这个调用前面加上类名(myleaf.SubClassA::f_PureVirtualBase() 那么它可以工作,但显然有问题,因为叶子 对象中包含2 个Base )。

有什么提示吗?

更多信息以回答评论

我的目标架构比我在原始问题中提供的示例稍微复杂一些:

LeafOne:继承自 SubClassA 和 SubClassB(SDK)

LeafTwo : 继承自 SubClassA 和 SubClassC(SDK)

LeafThree:继承自 SubClassA 和 SubClassD(SDK)

SubClassA 是我自己的私有代码。它提供自定义功能。SDK 方法应该能够将其视为 Base 实例。 此类不会被实例化,但它可以在执行某些处理时同时处理 LeafOne、LeafTwo 和 LeafThree。