初始化列表不检测公开继承的成员

时间:2016-03-14 21:24:52

标签: c++ inheritance constructor initializer-list

快速提问:我认为成员初始化列表与使用'='的常规初始化相同(除了只能使用初始化列表定义的const成员),调用具有特定属性的待初始化对象的构造函数我正在传递的参数,如下面的示例所示(我将x的构造函数调用为值1)。但令我惊讶的是,在简单继承的情况下,编译器抱怨没有看到我正在尝试使用我的构造函数初始化的成员,尽管看到另一个用通常的'='语法初始化的成员:

#include <iostream> 
using namespace std;

class A
{
public:

    int x;
    int y;
};

class B : public A
{
public:

    B() : x(1)
    {
        y = 2;
    }
};

int main()
{   
    return 0;
}

如果你运行上面的代码,你会看到虽然y被检测到没有问题,你的编译器会说在'B():x(1)'行没有名为'x'的成员。这是为什么?继承是公开的,可以看到,没有问题,为什么不是x呢?

2 个答案:

答案 0 :(得分:1)

您无法从类x的初始值设定项列表中初始化B,因为只有类A可以初始化其成员。

顺便说一句,公开数据成员并不是一个好主意。以下是您的代码如何工作的示例:

#include <iostream> 
using namespace std;

class A
{
public:
    A(int x, int y) : x(x), y(y) {}
protected:

    int x;
    int y;
};

class B : public A
{
public:

    B() : A(1, 5000)
    {
        y = 2;
    }
};

int main()
{   
    return 0;
}

答案 1 :(得分:0)

我想我找到了答案:

当正在执行类A的构造函数时,我的对象已经被初始化了一次,因此在运行B的构造函数时我无法重新初始化它。将y重新分配给值2是可以的,但是重新初始化x并将1作为其构造函数参数传递是导致编译器错误的原因。我错过了什么吗???