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

c++ - C++ 多重继承

请不要在这里质疑这段代码中真正奇怪的工人层次结构,我不知道为什么有人会想要这样的东西,但我决定给自己做一个多重继承练习,以确保我完全理解它。所以这就是结果。

希望你能理解我在这里想要做什么。我得到了一些关于“派生类'Supervisor'和基类'Employee'之间的模棱两可的转换。”那我该怎么办?

0 投票
1 回答
228 浏览

c++ - 指向多重继承中继承数据成员的指针

我正在尝试查看是否有办法从具有多重继承的类中获取指向数据成员的指针。有没有办法消除它们的歧义并仍然获得正确的偏移量?

编辑:我确实希望它们是 2 个独立的值,但两者都是

产生相同的值,如果继承树不是虚拟的,它们不应该是不同的偏移量吗?

0 投票
3 回答
179 浏览

c++ - 在存在菱形继承的情况下防止冗余函数调用

在存在菱形继承的情况下防止冗余函数调用的好策略是什么?具体来说,假设我们有一个程序:

当我们调用 d.print() 时,我们得到:

其中 a 已打印两次。有什么好的方法可以防止这种情况吗?当然,我们可以使用如下代码手动连接连接:

正确输出

但我想知道是否有更好的方法。就出现这种情况而言,想象一下对象 A、B、C 和 D 的情况很复杂,需要能够将自己写入磁盘。我们只想为每个 A、B、C 和 D 编写一次输出代码,重要的是 D 不要将 A 的信息写两次。

<---编辑--->

这里还有两种解决问题的方法,但它们仍然有点迟钝。第一个来自 Cristian,涉及设置是否已打印 A 的标志

这正确输出。第二种方法更复杂,但可能允许结构增长。基本上,我们将打印机从类中分离出来,然后在每个对象中注册一个打印机列表。当我们想要打印时,我们遍历打印机列表,然后为我们提供正确的输出。我觉得这使用了太多的机器,但我会包括以防其他人有更好的主意:

<---编辑 2--->

tmpearce 有一个好主意,在组装散列表之前将所有信息累积到散列表中。通过这种方式,可以检查个人信息是否已经创建并防止冗余。我认为当信息可以轻松组合时这是一个好主意。如果不是这种情况,可能会有轻微的变化,它结合了 tmpearce 和 Cristian 的想法。在这里,我们传递一个集合(或哈希表,或其他)来跟踪函数是否已被调用。通过这种方式,我们可以检查是否已经计算了某个函数。它不需要永久状态,因此多次调用应该是安全的:

在任何情况下,我都会将此问题标记为已解决。不过,我总是想听到更多的答案。

0 投票
2 回答
324 浏览

c++ - 创建涉及虚拟继承的类的过程

在很多描述虚拟基类用法的教程中(通常用来解决菱形问题),往往会有类似这种结构设计的代码:

当我创建 Fox 的实例时,我得到了预期的输出,只创建了一个 Animal:

如您所见,我虚拟继承了两个第 2 层类。现在,如果只有一个2 层类是虚拟继承的,而另一个是公开继承的,就会出现有趣的输出。例如,如果 FourLegs 是继承 public 而 Mammal 是继承 virtual public,则输出如下:

这很奇怪,并提出了一个问题:在继承树的某个地方创建一个涉及虚拟继承的类的完整过程是什么?

另一方面,如果我 FourLegs 如果继承了 virtual public,并且 Mammal 是继承了 public,那么输出是正常的(好像没有继承 virtual public):

0 投票
1 回答
349 浏览

c++ - 得到钻石继承工作,但 Eclipse 仍然抱怨

感谢您的关注。

我正在通过 C++ 中的软件模式来熟悉它,并且在基于接口的编程方面遇到了问题 - 即菱形问题。

情况如下:有一个Widget类派生一个Button类,每个类都有自己的接口类。类Widgetfoo方法,Button类有Widget'foo方法和bar方法。

所以问题是 CButton 不仅继承了CWidget's foo,还继承了IButton's (这是纯虚拟的)。IButton但是通过在and中使用虚拟继承CWidget,它可以编译并运行,将 'foobar' 打印到屏幕上。

但问题是 Eclipse 被标记CButton button为错误:

这很奇怪,因为一切都按预期运行。这是 Eclipse 的语法检查器的问题吗?我知道这个问题还有其他解决方案,所以也许 Eclipse 试图告诉我我的方法不标准?

任何帮助将不胜感激。

编辑:我在 OSX Lion 上使用 gcc 4.2,以及最新版本的 Eclipse for c++。

0 投票
3 回答
249 浏览

oop - 多态对象创建——菱形继承层次

语言:C/C++
问题:举个常见的例子,其中

  • A是父类。
  • BC都继承自类A
  • D继承自BC

我们想通过D的对象访问A的函数

注意:它是虚拟继承!所以我们知道A只有一个对象。

问题是:谁的对象将首先创建BC

牢记层次结构

0 投票
1 回答
157 浏览

python - Python中的一对多继承

关于我是否会以最好的方式做某事的问题......

我想在 Python 中有一个类层次结构,看起来(至少)如下所示;

但是我遇到了这样一个事实,即我想从每个子类Actor中初始化某个属性,如下所示;MoverAttacker

如果我当时采用我最初的方法,并按照我在使用超类构造函数方面一直使用的方法,我显然最终会调用Actor构造函数两次——这不是问题,但我的程序员感觉到刺痛并说我'宁愿以更清洁的方式进行;

例如,我只能调用Mover构造函数,并简单地初始化Human' _range,但这是一种糟糕的方法,因为它复制了 . 的初始化代码Attacker

就像我说的,我知道将_world属性设置两次没什么大不了的,但是您可以想象,如果在 中进行更密集的操作Actor.__init__,这种情况会令人担忧。任何人都可以建议在 Python 中实现这种结构的更好做法吗?

0 投票
7 回答
16400 浏览

c# - 接口如何解决钻石问题?

我需要和你讨论一件事。我一直在阅读有关接口的信息,它是类与接口之间的契约,该类将提供接口所有方法的实现。为了解决著名的钻石问题,我们有接口。喜欢(我正在使用 C#)

现在

通过上面的代码,可以说aClass已经提供了接口的两个方法的实现。我的困惑是:如果它是类和接口之间的契约,那么我们怎么能说与两个接口的契约都被履行了?

一个真实的例子,就像我和杰克有合同,我会给他 5 美元,同时我也和本有合同,我会给他 5 美元,现在通过向其中一个人(杰克或本) 我怎么能说我已经履行了与他们双方的合同?

我的问题可能看起来很幼稚,但这让我很困惑。

0 投票
2 回答
2502 浏览

c++ - 在虚拟继承中交换和复制习语的正确方法是什么?

考虑经典的虚拟继承菱形层次结构。我想知道在这种层次结构中复制和交换习语的正确实现是什么。

这个例子有点人为——而且它不是很聪明——因为它可以很好地使用 A、B、D 类的默认复制语义。但只是为了说明问题 - 请忘记示例弱点并提供解决方案。

所以我有从 2 个基类 (B<1>,B<2>) 派生的 D 类 - 每个 B 类实际上都继承自 A 类。每个类都具有使用复制和交换习语的非平凡复制语义。最派生的 D 类在使用这个习语时有问题。当它调用 B<1> 和 B<2> 交换方法时 - 它交换虚拟基类成员两次 - 所以 A 子对象保持不变!!!

A:

丁:

S只是一个存储字符串的类。

进行复制时,您会看到 A::s 保持不变:

结果是:

可能添加B<N>::swapOnlyMe会解决问题:

但是当 B 从 A 私下继承时呢?

0 投票
1 回答
1761 浏览

python - python多重继承:避免以菱形调用构造函数两次

考虑以下代码:

据我了解,算法如下:

实际上存在三个问题:
1. 为什么super().__init__()调用B.__init__(at 2) 调用的实例是什么C.__init__时候? 2. 这种情况下如何避免调用and两次? 2.1 初始化当前类继承的所有类的正确方法是什么?selfD
C.__init__A.__init__