当执行baseconstructor时使用c++

c++ when is baseconstructor executed?

本文关键字:c++ 执行 baseconstructor      更新时间:2023-10-16

关于c++继承的一些问题:

基本构造函数的代码执行顺序是什么?

有办法影响这个秩序吗?(例如,其他语言允许在构造函数中的某个位置放置"super()")

在构造函数中访问基类的受保护成员可以吗?

假设类A有i个基类B_i,所有B_i构造函数都在执行A构造函数的任何代码之前执行。唯一的例外是,当您使用非默认构造函数初始化基类时,但一旦它们运行,所有基类都会被执行,而且它们必须在初始化程序列表中排名第一。访问基类的受保护成员是可以的,因为基类已经构造好了。

例如:

class A : public B, C {
  A()
  : B(1), //B and C are now constructed
    memberOfA(memberOfB)
  {
  }
};

如果您的成员memberOfA需要来自B的名为memberOfB的东西,那么这很好,因为B已经构造好了。

构造顺序在c++中定义得很好。构造从完整(大多数派生类型)的初始化列表中开始,所有其他构造函数都从该列表中调用。首先是虚拟基,然后是声明的另一个中的直接基(在trun中,这些基将应用相同的顺序来构造它们自己的基和成员),最后是成员,按照类中声明的顺序,而不是初始化列表中调用构造函数的顺序。

无法影响构造发生的顺序,并且在派生类型的构造中访问基础构件是安全的。可能令人惊讶的是,在相反的方向上,从基构造函数调用虚拟函数。在构建过程的每一步,对象的类型都会发生变化。也就是说,给定一个基为B_i的X类型的对象,只有在所有B_i子对象都完成之后,并且就在X的第一个成员开始之前,该对象的类型才变为X。这意味着在基类中调用虚拟方法将被分派到该基类,而不是被分派到正在构造的最终类型。

总是首先调用"父"/超级类的构造函数。在多重继承的情况下,这是递归的。(这也是你真的不想在C++中使用虚拟行为构造函数的原因之一;)至于访问超级类的成员:这很好,它们是初始化的。