Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用带有继承变量的初始值设定项列表_C++_Inheritance_Initializer List - Fatal编程技术网

C++ 使用带有继承变量的初始值设定项列表

C++ 使用带有继承变量的初始值设定项列表,c++,inheritance,initializer-list,C++,Inheritance,Initializer List,我已经摆弄一个程序大约20分钟了,我发现出于某种原因,它不允许我在初始化列表中使用继承的变量。例如,此程序: class A { protected: int i; }; class B : public A { public: B() : i(45) { } }; int main() { B b; } 将给出错误 错误:类“B”没有任何名为“i”的字段 但是,如果将构造函数更改为: B() { i = 45; } 它编译 我从来不知道你

我已经摆弄一个程序大约20分钟了,我发现出于某种原因,它不允许我在初始化列表中使用继承的变量。例如,此程序:

class A {
protected:
        int i;
};

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

int main() {
        B b;
}
将给出错误

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

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

B() { i = 45; }
它编译


我从来不知道你不能初始化继承的变量。我的问题是,为什么?一个对象只能初始化一次:当它第一次出现时

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


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

您必须在类A中定义带有参数的公共构造函数。然后在类B中使用从基类到构造函数。 例如:

#包括
使用名称空间std;
甲级{
受保护的:
int i;
公众:
A(整数):i(数){}
};
B类:公共A{
公众:
B():A(45){}
};
int main(){
B B;
}

<代码> > p>你不能在C++中这样做。通常的方法是在父类中使用(
受保护的
)构造函数,该构造函数接受用于设置变量的参数


几乎从不建议使用这样的受保护属性,因为这样子类会违反父类不变量,这只会在以后引起严重的调试问题。

严格来说,全局类可以初始化两次。首先是零初始化,然后初始化它。但是,对于这种情况仍然正确。:)啊,这很有道理。谢谢
#include <iostream>
using namespace std;

class A {
protected:
    int i;
public:
    A(int number) : i(number) {}
};

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

int main() {
    B b;
}