使用带有继承变量的初始化列表

Set*_*gie 4 c++ inheritance initializer-list

我一直在摆弄一个程序大约20分钟,我发现由于某种原因它不会让我在初始化列表中使用继承的变量.这个程序,例如:

class A {
protected:
        int i;
};

class B : public A {
public:
        B() : i(45) { }
};

int main() {
        B b;
}
Run Code Online (Sandbox Code Playgroud)

会给出错误

错误:类'B'没有任何名为'i'的字段

但是,如果您将构造函数更改为:

B() { i = 45; }
Run Code Online (Sandbox Code Playgroud)

它汇编.

我从来不知道你不能初始化继承的变量.我的问题是,为什么?

Jam*_*lis 10

一个对象只能初始化一次:它首次出现时.

A在其构造函数中初始化其所有成员变量(在其构造函数的主体执行之前).因此,B无法初始化成员变量,A因为成员变量已经由构造函数初始化A.

(在这个特定情况下,技术上i是未初始化的,因为A没有初始化它;也就是说,A初始化其成员变量仍有责任.)