10
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 对 C 的继承,编译器会说 a 不可访问,就像我期望的那样。那么 C 的继承会让我的编译器感到困惑吗?

编译器是 gcc 4.4.7

4

1 回答 1

4

看起来像一个真正的编译器错误,因为标准不允许在

11.2 基类和基类成员的可访问性

在标准本身之外寻找证据时,WhozCraig 已经提出 clang 不允许此类访问。

寻找可能在 gcc 中混淆的类似模式,虚拟基类 A 的 diamon-inheritance 允许此类访问,因为大多数访问的路径决定了应用哪些保护。

于 2014-04-11T23:44:15.093 回答