C++突破private的方案

文章目录

  • C++突破private的方案
    • 方法一:调用公共成员函数
    • 方法二:友元函数
    • 方法三:使用 指针与引用访问
    • 方法四:指针的类型装换
    • 方法五:利用模版合法

方法一:调用公共成员函数

#include <iostream>
using namespace std;class X
{private:int a;int b;public:X(): a(3), b(4){}int geta(){return a;}void seta(int x){a = x;}int getb(){return b;}void setb(int x){b = x;}friend int setgetbx(X &,int x);
};int main()
{X s = X;cout<<"init a="<<s.geta()<<endl;cout<<"init b="<<s.getb()<<endl;s.seta(10);s.setb(10);cout<<"reset a="<<s.geta()<<endl;cout<<"reset b="<<s.getb()<<endl;return 0;
}

方法二:友元函数

#include <iostream>
using namespace std;class X
{private:int a;int b;public:X(): a(3), b(4){}int geta(){return a;}int getb(){return b;}friend int setgetbx(X & x,int temp);// 类内声明友元函数
};// 类外定义友元函数
int setgetbx(X & x,int temp)
{                           x.b += temp;return x.b;
}int main()
{X s = X();cout<<"init a="<<s.geta()<<endl;cout<<"init b="<<s.getb()<<endl;int newb = setgetbx(s,5);    //调用友元函数cout<<"reset b="<<newb<<endl;cout<<"reset b="<<s.getb()<<endl;return 0;
}

方法三:使用 指针与引用访问

#include <iostream>
using namespace std;class X
{private:int a;int b;public:X(): a(3), b(4){}int geta(){return a;}int getb(){return b;}
};int main()
{X s = X;cout<<"init a="<<s.geta()<<endl;cout<<"init b="<<s.getb()<<endl;int *ptr = (int *)(&s); // 强转类指针cout<<"init a="<<*ptr<<endl;cout<<"init b="<<*(ptr+1)<<endl;//注意因为类当中刚好只有两个int类型的变量,如果有其他情况把指针后移对应大小即可*ptr = 5;//指向a*(ptr + 1) = 5;// 指向bcout<<"pointer reset a="<<s.geta()<<endl;cout<<"pointer reset b="<<s.getb()<<endl;return 0;
}

方法四:指针的类型装换

  • X与Y 里面的成员变量x.a x.b的位置一一对应
#include <iostream>
using namespace std;class X
{private:int a;int b;public:X(): a(3), b(4){}int geta(){return a;}int getb(){return b;}
};class Y
{public:int a;   //与 X里面a对应int b;    //与 X里面b对应
};void Func(X* xPtr)
{// reinterpret_cast 用于进行各种不同类型的指针之间、// 不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。(reinterpret_cast<Y*>(xPtr))->b = 2;
}int main()
{X s = X;cout<<"init a="<<s.geta()<<endl;cout<<"init b="<<s.getb()<<endl;Func(&s);Func(&s);//cout<<"reinterpret_cast reset a="<<s.geta()<<endl;cout<<"reinterpret_cast reset b="<<s.getb()<<endl;return 0;
}
  • 如果不对齐的话看下面一个实验
#include <iostream>
using namespace std;class X
{private:int a;int b;public:X(): a(3), b(4){}int geta(){return a;}int getb(){return b;}
};class Y
{public:int b;
};void Func(X* xPtr)
{// reinterpret_cast 用于进行各种不同类型的指针之间、// 不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。(reinterpret_cast<Y*>(xPtr))->b = 2;
}int main()
{X s = X;cout<<"init a="<<s.geta()<<endl;cout<<"init b="<<s.getb()<<endl;Func(&s);   //attentioncout<<"reinterpret_cast reset a="<<s.geta()<<endl;cout<<"reinterpret_cast reset b="<<s.getb()<<endl;return 0;
}
  • 此时修改Y的b 但是确实修改X里面的a,这是因为 Y的b 与X的啊 在类内具有相同的内存位置,归根究低还是对指针与实际内存的操作

方法五:利用模版合法

#include <iostream>
using namespace std;class X
{private:int a;int b;public:X(): a(3), b(4){}template<typename T>//在X类内定义成员模板函数void Func(const T &t){}int geta(){return a;}int getb(){return b;}
};//外部Y类
class Y
{};template<>
void X::Func(const Y&) //特化,attention
{a=2;b=8;
}int main()
{X s = X;cout<<"init a="<<s.geta()<<endl;cout<<"init b="<<s.getb()<<endl;s.Func(Y());//attentioncout<<"template reset a="<<s.geta()<<endl;cout<<"template reset b="<<s.getb()<<endl;return 0;
}

这种方法利用了X具有一个成员模板的事实,通过特化函数模版,来打入敌人内部。代码完全符合标准,标准也确保这种行为会按照编码者的意图行事。boost和loki中大量运用此手法

C++突破private的方案相关推荐

  1. 通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值

    import operate425.demo.demo1.Student;import java.lang.reflect.Constructor; import java.lang.reflect. ...

  2. 2020 腾讯广告算法大赛:突破高分瓶颈方案分享

    写在前面 期待已久的2020腾讯广告算法大赛终于开始了,本届赛题"广告受众基础属性预估".本文将给出解题思路,以及最完备的竞赛资料,助力各位取得优异成绩!!! 报名链接:https ...

  3. 如何单元测试Java的private方法

    问题 Java类中private方法通常只能被其所属类的调用,其他类只能望而却步,单元测试private方法也就一筹莫展. 尝试解法: 在测试时,手动将private改为public,测试完后再将其改 ...

  4. 【方案分享】阿里城市大脑数据智能解决方案.pdf(附下载链接)

    大家好,我是文文(微信:sscbg2020),今天给大家分享阿里云数字产业发展部和数字产业产研部联合放不的解决方案<阿里城市大脑数据智能解决方案.pdf>,智慧城市赛道的伙伴们可以重点参考 ...

  5. 探索设计模式之六——单例模式

    前面说提到的五种创建模式,主要解决的问题是如何创建对象,获得产品.而单例模式最要关心的则是对象创建的次数以及何时被创建. Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章 ...

  6. 基于忆阻器的神经网络应用研究!道翰天琼认知智能机器人平台API接口大脑为您揭秘。

    基于忆阻器的神经网络应用研究!道翰天琼认知智能机器人平台API接口大脑为您揭秘. 基于忆阻突触器件的硬件神经网络是神经形态计算的重要发展方向,是后摩尔时代突破传统冯·诺依曼计算架构的有力技术候选.综述 ...

  7. 游戏研发面经汇总(C++语言,前部分贴上连接进行了解答)

    作者:leottt 链接:https://www.nowcoder.com/discuss/46728?type=post&order=time&pos=&page=1 来源: ...

  8. 基于忆阻器的神经网络应用研究!道翰天琼认知智能机器人平台API接口大脑为您揭秘-3。

    基于忆阻突触器件的硬件神经网络是神经形态计算的重要发展方向,是后摩尔时代突破传统冯·诺依曼计算架构的有力技术候选.综述了国内外忆阻硬件神经网络的近期发展现状,从器件发展和神经网络两个方面,详细阐述了忆 ...

  9. 单例模式之饿汉VS懒汉

    我的疑问和观点: 网上的各位大侠的普遍观点是"懒汉模式是为了在需要实例的时候再创建,可以节省内存的不必要占用." 情况1:在该类中存在常用的静态方法或者其他静态成员,使用这些静态方 ...

最新文章

  1. Python实现tab文件操作
  2. (一)win7下cocos2d-x 21 + vs2010
  3. VarGFaceNet
  4. JRebel的优势与使用(基于IDEA)
  5. TQ210裸机编程(4)——按键(中断法)
  6. 【数据挖掘笔记一】引论
  7. 微服务【1.1】Swagger的使用
  8. linux 日志按大小切割_日志切割工具logrotate,帮你管理你的日志文件
  9. 关于volatile(转)
  10. MySQL表结构设计之范式化和反范式化对比
  11. 《JAVA与模式》之观察者模式
  12. .net如何获取文件夹中的文件_access递归列出文件夹中的文件
  13. vue 项目配合zepto的巨坑
  14. 如何手动优化机器学习模型超参数
  15. lokohelp康复机器人_Lokohelp康复机器人在脑卒中偏瘫患者下肢运动功能恢复中的应用...
  16. consul报错:consul at least one health check on one instance is failing
  17. 教师招聘计算机面试技能测试,教师招聘面试中技能测试指什么
  18. 沐风:可怕的想什么就来什么
  19. C# 中的MessageBox 弹出提示框(消息框)的用法
  20. 利用ZigBee和线程快速构建网格连接的照明应用

热门文章

  1. 白苹果了怎么强制开机_iphone X 手机进水开机卡白苹果怎么回事?
  2. 使用软碟通安装 CentOS Stream 会遇到哪些问题
  3. 【小题目】输入三个数字表示年月日,输出这一天在这一年是第几天
  4. Altium Desiger18 打印 丝印简单的方法
  5. 在Office 365 添加就地保留用户邮箱
  6. PHP实习之路—NO.2(看IPB博文的源码,理清别人开发的思路)
  7. 善于总结所做所学的内容
  8. CodeForces - 560E Gerald and Giant Chess(组合数学+dp)
  9. CodeForces - 1335F Robots on a Grid(拓扑找环+反向dfs/倍增)
  10. CodeForces - 1291D Irreducible Anagrams(思维+构造)