C++ 如何突破private成员的访问限制

c++中类的private成员对外是不可见的,以下方法可以突破private成员的访问权限。
// accessPrivateMember.h
class A
{
private:
    int mPrivate;
    int nPrivate;
public:
    A(): mPrivate(3), nPrivate(4){}
    template<typename T> void func(const T &t){}
    const int GetValueN()
    {
        return nPrivate;
    }
};
1、操作指针修改内存数据
#include <iostream>
#include "accessPrivateMember.h"

int main()
{
    A obj = A();
    int tmp = 7;
    int *ptr = (int *)(&obj);
    *(ptr+1) = tmp;
    std::cout<<"nPrivate: "<<obj.GetValueN()<<std::endl;
    return 0;
}
2、使用友元声明
在类内声明一个友元函数,在类外进行定义。
#include <iostream>

class A
{
private:
    friend void hiJack(A &);
    int mPrivate;
    int nPrivate;
public:
    A(): mPrivate(3), nPrivate(4){}
    template<typename T> void func(const T &t){}
    const int GetValueN()
    {
        return nPrivate;
    }

};
void hiJack(A &a)
{
    a.nPrivate = 2;
}
int main()
{
    A obj = A();
    hiJack(obj);
    std::cout<<"nPrivate: "<<obj.GetValueN()<<std::endl;

    return 0;
}
3、使用模板
    类A中定义了一个模板函数func,在类外加一个模板函数,导致模板推演的过程中多出一个自己写的并且加入了备选组中,相当于多了一个重载。
类外函数的参数是在匿名空间中定义的特定类型,所以避免扰乱原本该函数的功能。
#include <iostream>
#include "accessPrivateMember.h"

namespace {struct B{};}   // struct member default public
template<> void A::func(const B &)
{
    nPrivate = 2;
}
int main()
{
    A obj;
    obj.func(B());
    std::cout<<"nPrivate: "<<obj.GetValueN()<<std::endl;
    return 0;
}
4、#define private public
使用#define把private定义为public,这样类中定义的private起始就是public。不推荐使用这种方法。
5、使用指针类型转换
在linux g++下试验的时候,发现这种方法没有生效,nPrivate的值仍然为4。原因需要后续研究...
#include <iostream>
#include "accessPrivateMember.h"

class B
{
public:
    int nPrivate;
};
void funa(A *aPtr)
{
    (reinterpret_cast<B*>(aPtr))->nPrivate = 2;
}
int main()
{
    A obj = A();
    funa(&obj);
    std::cout<<"nPrivate: "<<obj.GetValueN()<<std::endl;
    return 0;
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值