初始值设定项列表未检测到公共继承的成员
Initializer list doesn't detect publicly inherited member
快速问题:我认为成员初始化列表的行为与使用"="的正常初始化相同(除了只能使用初始化列表定义的 const 成员),使用我传递的特定参数调用待初始化对象的构造函数,如下面的示例所示(我用值 1 调用 x 的构造函数)。但令我惊讶的是,在简单继承的情况下,编译器抱怨没有看到我尝试用构造函数初始化的成员,尽管看到另一个用通常的"="语法初始化的成员:
#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"的成员。为什么?继承是公开的,y被看到,没有问题,为什么x不呢?
你不能从类B
的初始值设定项列表中初始化x
,因为只有类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;
}
我想
我已经找到了答案:
当执行类 A 的构造函数时,我的对象已经被初始化一次,因此在运行 B 的构造函数时我无法重新初始化它。将 y 重新赋值为 2 是可以的,但将 1 作为其构造函数参数传递重新初始化 x 是编译器错误的原因。我还错过了什么吗???
相关文章:
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 派生类调用使用非继承成员的继承函数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C :原始成员与继承成员的优先级
- 更改继承成员的地址
- C 是否可以不继承成员
- 使用模板的继承阴影继承成员
- 继承成员功能的模板专业化
- 不允许继承成员,为什么
- 派生模板类和继承成员变量的语法谜题
- 继承成员地址的C++标准
- 多级继承成员访问
- 访问专用模板的私有/继承成员变量
- 基模板继承成员,减少所需的类型
- 继承成员函数指针
- 模板专用化类不继承成员
- C++14正在初始化类构造函数初始化列表中的继承成员
- 具有专门初始化的继承成员变量
- 模板继承成员字段
- 访问数据成员的继承成员函数