4

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

class A {
protected:
        int i;
};

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

int main() {
        B b;
}

会报错

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

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

B() { i = 45; }

它编译。

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

4

3 回答 3

10

一个对象只能被初始化一次:当它第一次出现时。

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

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

于 2011-06-10T23:05:46.013 回答
4

你不能在 C++ 中做到这一点。通常的方法是protected在父类中有一个 () 构造函数,它接受一个用于设置变量的参数。

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

于 2011-06-10T23:08:58.533 回答
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;
}
于 2011-06-10T23:07:33.117 回答