You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

using声明能否引用间接基类公有成员(该成员在直接基类中已私有)?

问题核心

using声明能否引用间接基类的公有成员,而该成员在直接基类中被设置为私有?

代码示例

struct A {
    int member;
};

struct B : public A {
private:
    using A::member;
};

struct C : public B {
    using A::member; // #1
};

编译器行为差异

  • Clang、EDG和MSVC可正常编译上述代码
  • GCC会拒绝编译该代码
  • 若将#1行改为using B::member;,所有编译器都会拒绝编译

合法性判定

根据C++标准的访问控制规则:

  1. 直接基类B里的private using A::member;,只是把通过B访问member的权限设为私有,但完全不会改变间接基类A中member本身的公有属性。
  2. 派生类C是A的间接公有派生类,本身就拥有访问A公有成员的权限。#1处的using A::member;是直接引用间接基类A的公有成员,这个操作不受B的权限设置影响——B的私有using声明只是屏蔽了“通过B访问member”这条路径,并没有修改A中成员的权限,也无法阻止派生类直接访问间接基类的公有成员。

因此,#1处的using声明是合法的,GCC的拒绝属于编译器实现的不一致。

内容的提问来源于stack exchange,提问作者cpplearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 23:24:55