You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过成员指针访问受保护成员:这是否属于取巧操作?

嘿,这个问题确实挺有意思的——咱们先把基础规则掰扯明白,再聊聊那个能绕开限制的成员指针操作~

先明确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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:48:06