#include <stdio.h>
class a
{
public:
int var1;
a(int var)
{
var1 = var;
printf("set var1 to %d\n", var1);
}
};
class b: public a
{
public:
int var2;
b(int d) : var2(d++), a(var2++)
{
printf("d: %d, var2: %d, var1: %d\n", d, var2, var1);
}
};
int main()
{
int a = 5;
b obj1(a);
printf("%d\n", obj1.var1);
}
输出:
set var1 to 0
d: 6, var2: 5, var1: 0
0
[Finished in 0.7s]
为什么a.var1
未设置为6?
答案 0 :(得分:4)
因为C ++忽略了列出成员初始化的顺序。在初始化其他成员之前,总是调用基类ctor。 *
所以我相信你在这里调用未定义的行为;你传递var2
作为ctor参数,但它尚未初始化。
<小时/> *如果您允许,编译器应该警告您。例如,使用带有
-Wall
标志的GCC编译代码会显示以下消息:
test.cc: In constructor "b::b(int)":
test.cc:16: error: "b::var2" will be initialized after
test.cc:17: error: base "a"
test.cc:17: error: when initialized here
子>