成员空间可以访问父类的私有成员
Memberspaces may access private members of parent class
我一直在读这篇文章,在玩成员空间习语有一段时间时,我注意到这个片段中有一些让我惊讶的东西(它编译起来没有问题:http://ideone.com/hRiV5B):
class HugeClass
{
public:
struct memberspace
{
int f() const { return parent.f; }
private:
friend HugeClass;
explicit memberspace(HugeClass & parent)
: parent(parent) {}
HugeClass & parent;
} memberspace;
HugeClass() : memberspace(*this), f(42) {}
private:
int f;
};
我本以为会出现编译器错误,即不允许访问HugeClass::f
,因为f
在该上下文中是私有的。
HugeClass
是memberspace
的friend
,所以HugeClass
可以调用memberspace
的私有构造函数,但为什么它在不显式声明memberspace
为HugeClass
的friend
的情况下以另一种方式工作?
根据C++11中的语言规则。
嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。示例:
class E { int x; class B { }; class I { B b; // OK: E::I can access E::B void f(E* p, int i) { p->x = i; // OK: E::I can access E::x } }; };
在C++03中是
嵌套类的成员没有对封闭类的成员的特殊访问权限,也没有对类或赋予封闭类友谊的函数;通常的访问规则(第11条)应为服从
因此,C++11中的示例不应该与C++03编译器一起使用。
memberspace
是HugeClass
的一部分,与类的其他成员一样具有相同的访问权限。
相关文章:
- 从模板化父类中的派生内部类访问受保护的成员变量
- 如何从子类的构造函数初始化父类的私有成员
- 父类和子类中的 C++ 同名成员
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 对象在称为指向父类的指针时会丢失其成员的数据
- 将对象强制转换为派生类以访问父类的受保护成员
- 将子类的成员函数强制转换为父类
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何访问存储在父类中的子类成员
- C 不能将带有父类指针作为类型的静态模板成员定义引用
- 如何使用来自同名父类的成员函数(通过 this->)?
- 使父类成员对每个派生类不可修改
- 访问父类的成员"Invalid use of non-static data member" C++
- 使用父类中的私有成员调用父构造函数
- 带模板的继承(访问子类成员函数内父类的变量和对象)
- 如果成员对象是父类的一部分,则无法创建成员对象
- 子类不是父类的静态成员
- 多重继承.如何将 1 个父类的成员函数访问到另一个父类
- 为什么子类的私有成员函数可以从父类调用
- c++:访问父类的成员