C++:能否继承类及其受保护成员类型?代码是否符合标准?
在C++中继承类的受保护成员类型是否可行?以及一段代码的标准合规性分析
咱们先拆解你的问题,分两部分来解答:
一、从类的受保护成员类型继承是否可行?
答案是肯定的,但要遵守C++的访问权限规则。派生类有权访问基类的受保护成员(包括类型成员),所以在派生类的作用域内,你完全可以将基类的受保护类型作为自己的基类——前提是要在合法的上下文里访问这个类型。
二、你给出的代码是否符合C++标准?
结论:这段代码不符合C++标准,GCC和Clang的拒绝行为是正确的,MSVC接受它属于非标准扩展。
具体解释
先看你的代码:
struct B { protected: struct Type {}; }; struct D : B, B::Type {}; int main() { D d; return 0; }
问题出在D的基类列表中的B::Type。虽然D是B的派生类,有权访问B的受保护成员,但受保护成员的访问规则有个关键细节:
当你用限定名(比如B::Type)访问基类的受保护成员时,这个访问只能发生在派生类的成员函数、友元函数内部,或者是针对派生类自身的基类子对象进行操作。
而基类列表的上下文并不属于上述合法场景:这里直接用B::Type作为基类,相当于在D的类定义的“外部上下文”中,通过基类的限定名直接访问受保护类型,这违反了C++的访问控制规则。
正确的写法
因为D继承了B,B的受保护类型Type已经在D的作用域中可见,你可以直接使用非限定名Type作为基类:
struct B { protected: struct Type {}; }; struct D : B, Type {}; // 合法,符合C++标准 int main() { D d; return 0; }
这样写的话,所有遵循标准的编译器都会正常编译通过。
内容的提问来源于stack exchange,提问作者zwhconst
相关产品推荐
相关产品推荐

