有关c ++继承的一些问题:
baseconstructors的代码执行的顺序是什么?
有没有办法影响这个订单? (例如,其他语言允许在构造函数中的某处放置" super()"
是否可以在构造函数中访问受保护的基类成员?
答案 0 :(得分:1)
假设类A具有i基类B_i,则在执行A的构造函数的任何代码之前执行所有B_i构造函数。唯一的例外是当您使用非默认构造函数初始化基类时,但是一旦运行它们就会执行所有基类,并且无论如何它们必须首先进入初始化列表。可以访问受保护的基类成员,因为已经构造了基类。
例如:
class A : public B, C {
A()
: B(1), //B and C are now constructed
memberOfA(memberOfB)
{
}
};
如果您的成员memberOfA
需要来自B的名为memberOfB
的内容,那么这很好,因为B已经构建完毕。
答案 1 :(得分:1)
构造顺序在c ++中有明确定义。构造从完整(大多数派生类型)的初始化列表开始,从中调用所有其他构造函数。首先是虚拟基础,然后是另一个声明中的直接基础(这些将在trun中应用相同的顺序来构建自己的基础和成员),最后是成员,按照类中的声明顺序,而不是顺序似乎在初始化列表中调用了构造函数。
无法影响构造发生的顺序,并且在构造派生类型的过程中访问基础成员是安全的。可能令人惊讶的是,在相反的方向上,从基础构造函数调用虚函数。在构造过程的每个步骤中,对象的类型都会发生变化。也就是说,给定具有基数B_i的类型X的对象,仅在所有B_i子对象完成之后并且在X的第一个成员开始之前,对象的类型变为X.这意味着在基础中调用虚方法class将被分派到该基类,而不是被构造的最终类型。
答案 2 :(得分:0)
始终首先调用“父”/超类的构造函数。在多重继承的情况下,这是递归的。 (这就是你真的不想在C ++中使用虚拟行为构造函数的一个原因;)) 至于访问超类的成员:它非常好,它们被初始化。