突破C++中的访问权限

C++中的public,private等访问控制符并不是为了防止恶意的破坏行为,只是为 函数的封装等提供一个好的解决方案。但是有些时候,我们不得已需要突破这些访问权限,至少听说有些人面试的时候被要求这样做。

 

class  A {
public:
    A():private_(
1){};
private:
    
int private_;
}
;

 

首先有个办法最简单,但是不一定可以行得通,至少是和编译器和平台相关的。就是#define  private public

如果使用使用友元,也可以复制A的声明,

class  A {
public:
    A():private_(
1){}
private:
    
int private_;

friend ::Hijack(A 
&);
}
;

void  Hijack(A  & x) {
    A.private_ 
= 2;        //OK
}

如果不可以使用友元来实现这一点,那么可以利用C++中的内存布局来实现,例如

class  Hacker {
public:
    
int notSoPrivate;
}
;

void  f(A  & x) {
    (reinterpret_cast
<Hacker &>(x)).notSoPrivate = 2;                //OK
}

也可以使用联合体的内存布局的特点来做,但实际上和上面利用强制指针转换的原理是一样的。但是这样利用内存布局的方法存在很大的局限性,因为内存布局在不同的平台都有差异,没有可移植性。当然还有内存对齐的问题。

还用一种方法就是如果原类中有模板函数的话,就可以利用提供成员模板函数特化来破坏程序的封装性

namespace {
    
struct B{};
}


template
<>
void  A::f( const  B  & ) {
    private_ 
= 2;
}


void  fun() {
    A x;
    x.f(B());
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值