提问人:Johny Siemano Kolano 提问时间:1/25/2020 最后编辑:BoannJohny Siemano Kolano 更新时间:1/22/2022 访问量:554
为什么 x 成员变量不明确?
Why is the x member variable ambiguous?
问:
有人可以向我解释以下编译器错误,该错误说“x”是一个模棱两可的引用吗?
如果编译器知道其中一个变量实际上是不可访问的,为什么它不能允许这样做?
class A {
int x; // private here
};
class B {
public:
int x; // public here
};
class C : public A, public B {
};
int main() {
C c;
c.x = 5; // here is the error
return 0;
}
编辑: 对于那些向我解释私有并不意味着它不能改变的人 - 我知道这一点,并在下面做了这个简单的例子,但这不是我问的情况。
//
// the goal is to hack x, y values
//
#include <stdio.h>
#include <memory>
class A {
int x;
int _r;
double y;
public:
A() { x = 1; y = 0.5; _r = 0; }
void foo() { printf("x = %d, y = %lf, _r = %d\n", x, y, _r); }
};
int main() {
struct _B {
int x = 2;
double y = 1.5;
} b;
A a;
a.foo(); // gives "x = 1, y = 0.500000, _r = 0"
memcpy(&a, &b, sizeof(_B)); // where the sizeof B is eq 16 (4 for int, 4 for padding, 8 for double)
memcpy(&a, &b, sizeof(b.x) + sizeof(b.y)); // that is undefined behaviour, in this case _r is overridden
a.foo(); // gives "x = 2, y = 1.500000, _r = -858993460" (_r is just a part of floating point y value but with invalid cast)
return 0;
}
答:
4赞
Jesper Juhl
1/25/2020
#1
Your 包含两个变量。一个继承自每个父类。因此,是否要分配给 或 是 。仅仅因为一个不可访问并不意味着另一个将被自动选择。编译器无法知道您是打算尝试分配给 private(这将是一个不同的错误)还是 public 。C
x
A::x
B::x
A::x
B::x
此外,如评论中所述,与 .在第一种情况下,您公开继承,但私下继承(因为私有继承是默认继承,而默认继承是公共继承)。在第二种情况下,您将从两个基类公开继承。class C : public A,B
class C : public A, public B
A
B
class
struct
评论
0赞
Johny Siemano Kolano
1/25/2020
嗯,是的,没错,我刚刚修复了它,因为双重公共继承是我想做的,只是错过了我的咒语。但是,我仍然很好奇 c++ 标准是否对此有一些反馈。在 clang、gcc 和 MS 编译器中对其进行了测试,并且都报告了相同的错误。如果编译器知道其中一个在物理上是不可访问的,为什么他们不允许这样做?
1赞
Jesper Juhl
1/25/2020
@JohnySiemanoKolano 因为这就是C++标准所说的。
0赞
mfnx
1/25/2020
它们都是可访问的:)
0赞
Johny Siemano Kolano
1/25/2020
mfnx(在这种情况下无法访问 A::x)被声明为私有。
1赞
user207421
1/26/2020
@JohnySiemanoKolano并不能使非法程序合法化。private
0赞
Abhishek Sakharkar
1/22/2022
#2
编译器在编译时检查歧义。由于歧义检查发生在访问控制或类型检查之前,因此当它发现存在歧义时,编译器还不知道分配给这些变量的访问控制,因此会引发错误。希望能回答您的问题
评论
class C : public A,B
class C : public A, public B