调用构造函数的顺序 [英] Call order of constructors

查看:159
本文介绍了调用构造函数的顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <iostream>
using namespace std;    
struct A{
  A() {cout << "A" << endl;}
  A(int a) {cout << "A+" << endl;}
};

struct B : virtual A{
  B() : A(1) {cout << "B" << endl;}
};
struct C : virtual A{
  C() : A(1) {cout << "C" << endl;}
};
struct D : virtual A{
  D() : A() {cout << "D" << endl;}
};
struct E : B, virtual C, D{
  E(){cout << "E" << endl;}
};
struct F : D, virtual C{
  F(){cout << "F" << endl;}
};
struct G : E, F{
  G() {cout << "G" << endl;}
};

int main(){
  G g;
  return 0;
}

计划打印:

A
C
B
D
E
D
F
G

我想知道应该使用什么规则来确定构造函数的调用顺序。感谢。

I would like to know what rules should I use to determine in what order constructors get called. Thanks.

推荐答案

虚拟基础子对象首先由最大派生类构造,这是有意义的唯一方式,因为在运行时(因此虚拟)直到对象构造,虚拟基础与最大导出对象的关系是未知的。

Virtual base subobjects are constructed first, by the most-derived class, before any other bases. This is the only way that makes sense, since the relation of the virtual bases to tbe most-derived object is not known until object construction, at runtime (hence "virtual"). All intermediate initializers for virtual bases are ignored.

那么,你的虚拟基础是什么? G 源自 E F E 从 C 中实际派生,后者又从 A ,因此 A C 是第一个。接下来, F 不会添加任何其他虚拟库。接下来, E 有非虚基数 B D ,按顺序构建,然后 E 完成。然后 F 的非虚拟基础 D F 完成。最后, G 已完成。

So, what are your virtual bases? G derives from E and F. E derives virtually from C, which in turn derives virtually from A, so A, C are first. Next, F doesn't add any further virtual bases. Next, E has non-virtual bases B and D, in that order, which are constructed next, and then E is complete. Then comes F's non-virtual base D, and F is complete. Finally, G is complete.

总而言之,它是虚拟基础 code>, C ,则非虚拟基础 B code>, E D ,然后 G 本身。

All in all, it's virtual bases A, C, then non-virtual bases B, D, E and D, F, and then G itself.

这篇关于调用构造函数的顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆