C ++多重继承顺序

时间:2013-06-26 19:35:26

标签: c++ oop multiple-inheritance language-lawyer

我正在尝试理解C ++中继承顺序的影响。我在线查看,但我找不到明确而充分的答案......

因此,为了这个问题,假设有两个类:B类和C类。

现在,定义:

class A1 : public B, public C{ ... };
class A2 : public C, public B{ ... };

A1和A2有什么区别?

非常感谢!

2 个答案:

答案 0 :(得分:13)

  

派生顺序仅与构造函数的默认初始化顺序和析构函数清理相关。

     

除了由构造函数(12.6.2),清理(12.4)和存储布局(9.2,11.1)的初始化语义指定之外,派生的顺序并不重要。 - 尾注]“(§10.1/ 2)

来自IBM的C ++文档:Multiple inheritance

答案 1 :(得分:10)

C ++ 11标准说(第10.1节):

  

除非由指定,否则推导的顺序并不重要   构造函数初始化的语义(12.6.2),清理(12.4),   和存储布局(9.2,11.1)。

引用的三个段落揭示了

  • 按照您编写它们的顺序调用构造函数(首先构造列表中的第一个基类)(第12.6.2.10节)。不同的规则适用于虚拟基类,它们总是在任何直接基类之前从最派生的类构造。
  • 以相反的构造顺序调用析构函数(列表中的第一个基类最后被破坏)
  • 未指定存储布局。您不能对内存中的类布局做任何假设。唯一的例外是所谓的标准布局类(§9),它基本上是一个C风格的结构。但是由于不允许在类层次结构中有多个具有非静态成员的类,因此这个问题并不适用。

请注意,内存布局非常重要。例如,如果外部库进行天真的C样式转换,假设它感兴趣的对象部分位于开头,则可能导致难以调试的运行时错误。