C++中嵌套类的嵌套类是否拥有外围类成员的访问权限?
深层嵌套类是否有权访问最外层外围类的所有成员?
放心,你的代码完全符合C++标准,g++ 7.2无警告编译的结果是正确的——深层嵌套类(比如示例里的A::B::C)确实可以访问最外层外围类(A)的所有成员,包括私有成员。
为什么这是合法的?
C++标准里关于嵌套类访问权限的规则(出自[class.access.nest]章节)有明确说明:
嵌套类属于外围类的成员,拥有和其他成员相同的访问权限。外围类的成员访问嵌套类成员时要遵循常规规则,但反过来,嵌套类的成员可以无障碍访问其外围类的所有成员。
对于多层嵌套的情况,这个权限是“穿透”的:A::B是A的成员,所以B能访问A的私有成员;而A::B::C是B的成员,同时它也属于A的嵌套成员范畴,因此C同样有权访问A的所有成员——包括私有静态成员x。
结合你的代码来看
我们拆解一下你的示例代码:
#include <iostream> class A { public: class B { public: B() { std::cout << A::x << std::endl; } // 合法:B是A的嵌套类,可直接访问A的私有成员 class C { public: C() { std::cout << A::x << std::endl; } // 合法:C是B的嵌套类,继承了对A成员的访问权限 }; }; private: static const int x { 0 }; }; int main() { A::B b; A::B::C c; }
不管嵌套多少层,只要是从外围类逐层嵌套出来的类,都能访问最外层(以及每一层)外围类的私有、保护和公有成员。这就是你的代码能正常编译运行的原因。
内容的提问来源于stack exchange,提问作者Robert E. Brown
相关产品推荐
相关产品推荐

