绕过protected方法的调用(包级共享)

A类在a包

package a;

import b.B;

public class A {
    protected void sys() {
        System.out.println("A protected sys方法");
    }

    public static void main(String[] args) {
        new B().sys();// 非法(想打印 B protected sys方法)
        ((A)new B()).sys();// 合法 打印 B protected sys方法
        //同一个对象,采用向上转型,就能执行被保护的方法
        //接口和实现类,接口中的方法只能是public(只能是public的原因应该是让调用方不存在非法调用)
        //上述采用非接口类(实类、抽象类),只要定义的方法能够执行(执行环境不非法),依旧能够执行子类的受保护方法
    }
}

B类在b包

package b;

import a.A;

public class B extends A {
    protected void sys() {
        System.out.println("B protected sys方法");
    }
}

此绕过protected 的保护机制,常用于 框架中,接口定义protected 方法,实现类在其他包(或给框架使用者实现),接口所在包 需要调用此方法。

### C++ 中从类外部访问 `protected` 成员的可能性 在 C++ 的访问控制机制中,`protected` 是一种特殊的访问修饰符。它规定受保护的成员可以在其所属类及其派生类中直接访问,但对于类外(即非友元类或函数)则无法直接访问。 #### 1. **`protected` 成员的访问特性** `protected` 成员具有双重性质: - 对于基类本身及其派生类而言,`protected` 成员类似于公有成员,可以直接访问[^2]。 - 对于类外部或其他无关类,则如私有成员一样不可见,无法直接访问[^1]。 因此,在标准情况下,尝试从类外部直接访问 `protected` 成员会引发编译错误。 --- #### 2. **通过友元关系访问 `protected` 成员** 尽管 `protected` 成员通常对外部隐藏,但如果某个类或函数被声明为该类的友元,则它可以绕过正常的访问限制来访问 `protected` 成员。这是由于友元机制赋予了指定实体特殊权限,使其能够像类内部成员一样操作对象的数据成员和方法。 以下是利用友元访问的一个例子: ```cpp class Base { protected: int value; public: Base(int v) : value(v) {} friend void accessProtected(Base& obj); // 声明友元函数 }; void accessProtected(Base& obj) { std::cout << "Accessing protected member: " << obj.value << std::endl; // 友元可访问 } int main() { Base b(42); accessProtected(b); // 输出:Accessing protected member: 42 } ``` 上述代码展示了如何借助友元函数打破常规约束并获取到原本受限的内容。 --- #### 3. **通过派生类间接访问** 虽然不能直接从外部调用 `protected` 属性的方法或字段,但可以通过创建一个继承自目标类型的子类,并在此基础上暴露接口给外界使用的方式实现变相接触目的资源的目的。下面是一个简单的示范案例: ```cpp #include <iostream> using namespace std; // 定义基础类别 class ParentClass { protected: string secretMessage; public: ParentClass(string msg):secretMessage(msg){}; virtual ~ParentClass(){} }; // 创建衍生类别公开父级的秘密消息 class ChildClass : public ParentClass{ public: explicit ChildClass(const string &msg) : ParentClass(msg){} const char* getSecret(){ return this->secretMessage.c_str(); } }; int main(){ ChildClass child("This is a hidden message."); cout<<child.getSecret()<< endl;// 显示秘密文字 return 0 ; } ``` 在这个实例里头我们看到即使原始资料设定成受保障状态仍有机会借由后代途径取得资讯。 --- #### 4. **静态成员与内部类的关系** 值得注意的是当涉及到静态成员时如果存在嵌套结构那么即便处于不作用范围内也可能因为共享命名空间的缘故而获得便利条件不过这种情况并不适用于一般讨论范畴内的跨边界读写行为而是特指那些已经建立好关联性的组件之间相互协作模式下的例外情形而已[^3]。 --- ### 结论 综上所述,默认状态下C++严格限制了来自类外部对`protected`成分的操作可能性;然而借助诸如设置友好型态或是设计合适的继承链条等手段依旧能够在一定程度上达成预期效果只是需要遵循相应语法规则时注意维护软件整体架构合理性以免造成不必要的混乱局面发生。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值