【问题标题】:Polymorphism object creation - diamond inheritance hierarchy多态对象创建——菱形继承层次
【发布时间】:2012-08-03 11:40:21
【问题描述】:

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

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

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

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

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

牢记层次结构

   A
 /   \
B     C
 \   /
   D

【问题讨论】:

    标签: oop diamond-problem


    【解决方案1】:

    简而言之,OO 本身对此没有任何保证

    如果您谈论的是特定的实现或语言(但问题不是),则可能对此有保证。

    【讨论】:

    • @AliShahzeb 在 C++ 中,这取决于您列出要继承的类的顺序,例如,class D : public B, public C 将在 C 之前构造 B。
    【解决方案2】:

    是的,这个问题有时也被省略为死亡之钻

    很遗憾,无法回答您的问题:它基于您当前使用的编程语言。

    例如,在 Scala 中(允许对特征进行多重继承),沿 linearization algorithm 的实例化有一条非常严格的规则,您可以在那里找到正确的详细信息。

    我想你在玩 C++。如果正确,请查看C++ FAQ (the problem is also mentioned there) 的正确部分。

    【讨论】:

    • 谢谢回答 :) 我欠你一个大的 :)
    • 没有问题,但是您可以添加您正在编码的语言的标签,也可以编辑问题文本以使其对其他人提供更多信息。
    【解决方案3】:

    如果你说的是 C++ 和类的实例化顺序,那么它将取决于声明中的继承顺序。

    所以,在

    class D :  public B,public C
    

    B 会先被实例化,然后是 C。

    class D :  public C,public B
    

    C 会先被实例化,然后是 B。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-27
      • 2013-12-25
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多