class A {
public:
int a;
};
class B: private A {
};
class C: public A {
};
class D: public B, public C {
D() {
B::a = 0;
}
};
即使B私有继承A,这也会编译。如果我删除D的D继承,编译器会说a是不可访问的,就像我期望的那样。那么C的继承会让我的编译器感到困惑吗?
编译器是gcc 4.4.7
答案 0 :(得分:4)
看起来像一个真正的编译器错误,因为标准不允许在
中进行此类访问11.2基类和基类成员的可访问性
在标准本身之外寻找证据,WhozCraig已经提出该clang不允许此类访问。
寻找可能在gcc中混淆的类似模式,有虚拟基类A的diamon-inheritance,它允许这样的访问,因为大多数访问的路径决定了什么样的保护适用。