0

C++

#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?

4

1 回答 1

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

于 2013-05-26T17:16:03.037 回答