通过成员指针访问受保护成员:这是否属于取巧操作?
嘿,这个问题确实挺有意思的——咱们先把基础规则掰扯明白,再聊聊那个能绕开限制的成员指针操作~
先明确C++的protected核心规则
咱们都清楚,C++标准里白纸黑字规定:基类中声明为protected的成员,仅能在派生类自身的实例范围内访问,根本碰不了其他同派生类(哪怕是同类型)实例的protected基类成员。这类问题在社区里已经被讨论过N次了,比如像「Cannot access protected member of another instance from derived type's scope」「Why can't my object access protected members of another object defined in common base class」这类经典提问,核心都是在说这个规则。
成员指针的“特殊通道”
不过正如用户chtz展示的那样,这里确实藏着一个能绕开这个限制的小技巧——用成员指针。咱们直接上代码看效果:
class Base { protected: int x; }; class Derived : public Base { public: void foo(Derived& other) { // 直接访问会报错:protected成员不可跨实例访问 // other.x = 42; // 但用成员指针就能顺利编译! int Base::*ptr = &Base::x; other.*ptr = 42; } };
为啥能这么玩?核心原因是:C对成员指针的访问权限检查,是在声明指针的那一刻完成的。在Derived类的作用域里,我们作为基类的派生类,有权获取Base的protected成员的指针;一旦拿到这个指针,后续用它访问任何Base/Derived实例的对应成员时,编译器就不会再做额外的权限校验了——这算是C权限规则里的一个特殊设计点。
内容的提问来源于stack exchange,提问作者YSC
相关产品推荐
相关产品推荐

