26

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

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

现在,定义:

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

A1和A2有什么区别?

非常感谢!

4

2 回答 2

16

C++11 标准说 (§10.1) [class.mi]

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

引用的三个段落表明

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

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

于 2013-06-26T20:08:39.150 回答
15

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

推导的顺序并不重要,除非构造函数 (12.6.2)、清理 (12.4) 和存储布局 (9.2, 11.1) 的初始化语义指定。——尾注]”(§10.1/2)

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

于 2013-06-26T19:37:23.563 回答