【问题标题】:Multiple inheritance makes private member accessible多重继承使私有成员可访问
【发布时间】:2014-04-11 23:16:09
【问题描述】:
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

【问题讨论】:

  • 可能是钻石继承规则的干扰......这将是一个错误。
  • @Hans:想更具体一点吗?您是在建议替代方案吗?
  • 如果没有B:: 分辨率,它会更有趣,并且它实际上已编译。这确实用clang 3.4编译(有或没有B::分辨率)。
  • 这是MCVE。当然这是不合理的。顺便说一句,我什至看不出它在野外可能合理地发生在哪里。并不是说没有这样的独角兽。
  • @chuck1:访问和可见性是不同的、不相关的概念。访问被检查最后

标签: c++ gcc multiple-inheritance language-lawyer compiler-bug


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2020-09-04
    • 2020-09-01
    • 2018-05-11
    相关资源
    最近更新 更多