突破C++中的访问权限

本文介绍了几种在C++中绕过类成员访问限制的方法,包括宏定义、使用友元函数、强制类型转换以及通过成员模板函数特化等方式。这些技巧展示了如何在特定情况下突破封装限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值