继承c ++构造函数 - 谁先调用?

时间:2016-07-08 06:51:39

标签: c++ inheritance initialization

我有这段代码:

class A{
  A *prev, *next, *pLast;
  public:
    A(): prev(NULL), next(NULL)
    {
        pLast->next = this;
        pLast = this;
    }
}
class B: public A
{
   int y;
   public:
   B(int y1) : y(y1) {cout << "in cotr" << endl;}
}

我想知道是否首先调用A的构造函数(甚至在我为y插入值之前)?或者首先是y = y1,然后是A ctor,最后是B ctor(打印) 谢谢!

4 个答案:

答案 0 :(得分:1)

在初始化派生类的成员之前,首先调用基类构造函数。

答案 1 :(得分:1)

initialization order定义为:

  

列表中成员初始值设定项的顺序是无关紧要的:实际的   初始化顺序如下:

     

1)如果构造函数是针对派生程度最高的类的虚拟基础   类按它们出现的顺序初始化   基类深度优先从左到右遍历基类声明   (从左到右指的是基本说明符列表中的外观)

     

2)然后,直接基类按从左到右的顺序初始化为   它们出现在这个类的基本说明符列表中

     

3)然后,按照以下顺序初始化非静态数据成员   类定义中的声明。

     

4)最后,执行构造函数的主体

因此对于这种情况,初始化顺序将是(1)基类A(2)成员y(3)B的构造体。

答案 2 :(得分:0)

构造函数:base - &gt;最衍生的

析构函数:派生最多 - &gt;基

答案 3 :(得分:0)

这里有一种方法可以在不通过无休止的标准阅读的情况下找到答案(插入有关钓鱼和教学的内容)。

您需要在会员初始化期间打印一些内容 如果您的成员也是类的实例,则可以这样做:

A initialized
Member initialized
B initialized

打印

B

顺便说一句,这是一种可以使用&#34;逗号运算符&#34;的情况,这可以让我们避免那些额外的类。
像这样写struct B : A { B() : member((cout << "Member initialized\n", 0)) { cout << "B initialized" << endl; } int member; };

{{1}}

产生相同的输出 逗号运算符评估其左侧,抛弃结果,并返回右侧。 (这里需要一对额外的括号,以免被解释为两个参数。)
当您需要跟踪评估时,它可能很有用,但没有明显的方法来插入跟踪。