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++标准的访问控制规则:
- 直接基类B里的
private using A::member;,只是把通过B访问member的权限设为私有,但完全不会改变间接基类A中member本身的公有属性。 - 派生类C是A的间接公有派生类,本身就拥有访问A公有成员的权限。#1处的
using A::member;是直接引用间接基类A的公有成员,这个操作不受B的权限设置影响——B的私有using声明只是屏蔽了“通过B访问member”这条路径,并没有修改A中成员的权限,也无法阻止派生类直接访问间接基类的公有成员。
因此,#1处的using声明是合法的,GCC的拒绝属于编译器实现的不一致。
内容的提问来源于stack exchange,提问作者cpplearner
相关产品推荐
相关产品推荐

