C++多重继承顺序

TCS*_*TCS 23 c++ oop multiple-inheritance language-lawyer

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

所以,为了这个问题,假设有两个类:B类和C类.

现在,定义:

class A1 : public B, public C{ ... };
class A2 : public C, public B{ ... };
Run Code Online (Sandbox Code Playgroud)

A1和A2有什么区别?

非常感谢!

Haa*_*nti 15

推导的顺序仅与确定构造函数的默认初始化顺序和析构函数清理的顺序相关.

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

来自IBM的C++文档:多重继承

  • 乐意效劳.这是标准的引用:"[注意:除了由构造函数(12.6.2),清理(12.4)和存储布局(9.2,11.1)的初始化语义指定之外,派生的顺序并不重要.注意]"(§10.1/ 2) - IBM文档错过了关于布局的部分.(如果您愿意,也可以将其编辑到您的帖子中.) (5认同)

Com*_*sMS 14

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

除了由构造函数(12.6.2),清理(12.4)和存储布局(9.2,11.1)的初始化语义指定之外,派生的顺序并不重要.

引用的三个段落揭示了这一点

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

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

  • 我不"考虑"任何事情."实现定义"在C89 ANSI标准中定义,并且在C++中使用相同的定义.只有标准描述为"实现定义"的东西才被认为是"实现定义":**如果某些东西是"实现定义的",则需要实现来记录它**.当然,实现也可以记录它想要的任何内容.它可以描述`operator +`参数的评估顺序,但这不是必需的.它可以记录vtable的布局,但这不是必需的. (3认同)