我一直在摆弄一个程序大约20分钟,我发现由于某种原因它不会让我在初始化列表中使用继承的变量。这个程序,例如:
class A {
protected:
int i;
};
class B : public A {
public:
B() : i(45) { }
};
int main() {
B b;
}
会给出错误
错误:类'B'没有任何名为'i'的字段
但是,如果将构造函数更改为:
B() { i = 45; }
它编译。</ p>
我从来不知道你不能初始化继承的变量。我的问题是,为什么?
答案 0 :(得分:10)
一个对象只能初始化一次:它首次出现时。
A
在其构造函数中初始化其所有成员变量(在其构造函数的主体执行之前)。因此,B
无法初始化A
的成员变量,因为成员变量已由A
的构造函数初始化。
(在这种特定情况下,技术上i
未初始化,因为A
没有初始化它;也就是说,A
仍有责任初始化其成员变量。)
答案 1 :(得分:4)
你不能用C ++做到这一点。通常的方法是在父类中有一个(protected
)构造函数,它带有一个用于设置变量的参数。
几乎从不建议使用这样的受保护属性,因为它允许子类违反父类不变量,这只会导致以后严重的调试问题。
答案 2 :(得分:2)
您必须在类A中使用参数定义公共构造函数。然后在类B中使用基类中的构造函数。 例如:
#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;
}