Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;多重继承顺序 我试图理解C++中继承顺序的影响。我在网上查了一下,但我找不到一个清楚而充分的答案_C++_Oop_Multiple Inheritance_Language Lawyer - Fatal编程技术网

C++;多重继承顺序 我试图理解C++中继承顺序的影响。我在网上查了一下,但我找不到一个清楚而充分的答案

C++;多重继承顺序 我试图理解C++中继承顺序的影响。我在网上查了一下,但我找不到一个清楚而充分的答案,c++,oop,multiple-inheritance,language-lawyer,C++,Oop,Multiple Inheritance,Language Lawyer,为了回答这个问题,假设有两类:B类和C类 现在,定义: class A1 : public B, public C{ ... }; class A2 : public C, public B{ ... }; A1和A2的区别是什么 非常感谢 派生顺序仅与确定构造函数的默认初始化顺序和析构函数的清除顺序有关 除非构造函数初始化(12.6.2)、清理(12.4)和存储布局(9.2、11.1)的语义规定,否则派生顺序并不重要尾注]”(§10.1/2) C++文档 P> C++ 11标准称(10.1

为了回答这个问题,假设有两类:B类和C类

现在,定义:

class A1 : public B, public C{ ... };
class A2 : public C, public B{ ... };
A1和A2的区别是什么

非常感谢

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

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

C++文档<

> P> C++ 11标准称(10.1):

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

所引用的三段表明:

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

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

如果直接使用引号而不是使用链接,您的答案会更好。quote i直接存在?还是我遗漏了什么?是的,但原始链接很俗气:/是的。不确定如何设计它。这里很新,但我会尝试一些乐于帮助的东西。这里引用了标准:“[注:派生顺序并不重要,除非构造函数初始化(12.6.2)、清理(12.4)的语义规定(§10.1/2)-IBM文档遗漏了关于布局的部分。(如果您愿意,也可以将其编辑到您的帖子中。)有趣的问题。我想知道答案。我找到了这个链接-,它声称派生的顺序只与构造函数的默认初始化顺序和析构函数的清理有关。“也许有人能确认这个吗?我不考虑”任何东西。“实现定义”是在C89ANSI标准中定义的,而C++中使用了相同的定义。“已定义的实现”被视为“已定义的实现”:如果某物是“已定义的实现”,则需要实现对其进行记录。当然,实现还可以记录它想要的任何东西。它可以描述
运算符+
参数的求值顺序,但这不是必需的。它可以记录vtable的布局,但这不是必需的。“确定布局是实现的责任”实现还必须在每次编写
f(g(),h())
时从两种可能性中选择一种评估顺序,但很少描述它选择一种的方式。这个实现负责的许多事情都没有被记录下来,除了源代码。@curiousguy这正是答案想要表达的:你不能对类布局做任何假设。这里定义的术语实现在ISO口语和口语中的含义稍有不同(这是标准中使用的许多术语的情况)。为了避免这种混乱,我改变了答案的措辞。如果你的原始帖子已经包含了从第二篇到最后一篇的信息,那么我们可以在更少的帖子中做到这一点。谢谢你留下来陪我。很抱歉,但是没有意识到你在C++的STD意义上没有使用“实现定义”,直到我们交换了。