继承 C++ 构造函数 - 谁先调用
inheritance c++ constructor- who called first?
我有这个代码:
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 (打印)谢谢!
在初始化派生类的成员之前首先调用基类构造函数。
初始化顺序明确定义为:
成员初始值设定项在列表中的顺序无关紧要:实际 初始化顺序如下:
1) 如果构造函数用于派生最多的类,则虚拟基 类按它们出现的顺序进行初始化 基类声明的深度优先从左到右遍历 (从左到右是指基本说明符列表中的外观)
2)然后,直接基类按从左到右的顺序初始化为 它们出现在此类的基本说明符列表中
3)然后,非静态数据成员按以下顺序初始化: 类定义中的声明。
4)最后,执行构造函数的主体
因此,对于这种情况,初始化顺序将是 (1) 基类A
(2) 成员y
(3) B
的构造器主体。
构造函数:基 -> 最派生
析构函数:大多数派生的 -> 基础
这里有一种方法可以在不阅读无休止的标准术语的情况下找出答案(插入一些关于钓鱼和教学的内容)。
您需要在成员初始化期间打印一些内容。
如果您的成员也是类的实例,则可以执行此操作:
struct Member
{
Member(int i) { cout << "Member initialized" << endl; }
};
struct A
{
A() { cout << "A initialized" << endl; }
};
struct B : A
{
B() : member(0) { cout << "B initialized" << endl; }
Member member;
};
int main()
{
B b;
}
这打印
A initialized
Member initialized
B initialized
顺便说一句,这是可以使用"逗号运算符"的一种情况,这让我们可以避免额外的类。
像这样写B
:
struct B : A
{
B() : member((cout << "Member initializedn", 0)) { cout << "B initialized" << endl; }
int member;
};
产生相同的输出。
逗号运算符计算其左侧,丢弃结果,并返回右侧。(这里需要一对额外的括号,以免被解释为两个参数。
当您需要跟踪评估但没有明显的方法来插入跟踪时,它可能很有用。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用