首页 > 编程语言 >C++逆向分析——类成员的访问控制

C++逆向分析——类成员的访问控制

时间:2023-04-09 10:56:19浏览次数:38  
标签:Print1 逆向 访问控制 成员 private class int C++ public

类成员的访问控制

课外 → 好的编程习惯:定义与实现分开写,提升代码可读性。

如下代码,Student这个类的所有成员我们都可以调用,但是我们不想让被人调用Print1这个方法该怎么?

struct Student { int age; int sex;   void Print1() { printf("Func Print1"); }   void Print() { printf("Func Print"); } };

这里我们可以使用关键词:private、public来控制我们想被人访问的和不想被人访问的成员:

struct Student { private: void Print1() { printf("Func Print1"); }   public: int age; int sex; void Print() { printf("Func Print"); } };

当我们调用Print1的时候就会发现无法编译:

images/download/attachments/12714553/image2021-4-4_20-38-26.png

private(私有)、public(公有)的使用总结:

  1. 对外提供的函数或者变量,定义成public,不能随意改动

  2. 可能会改动的函数或者变量,定义成private,使用时编译器会检测

  3. 只有当前结构体内部函数才可以访问private的成员

  4. private、public可以修饰函数或者变量

那么问题来了,private修饰的函数或者变量真的不能访问吗?并不是,只是我们没有办法通过正常的方式去使用,但是我们可以使用指针的方式去调用:

images/download/attachments/12714553/image2021-4-4_21-10-51.png

那就说明private修饰的成员与普通成员没有区别,只有编译器会检测。

从这节课开始我们不再使用struct作为类的创建,而是直接使用class关键词,其使用没有什么区别,唯一的区别在于成员默认访问属性不一样,在struct中所有成员默认的属性是public,而在class中则相反:

images/download/attachments/12714553/image2021-4-4_21-17-6.png

除此之外还有一个就是在继承时的区别,我们可以将一个正常的struct继承修改成class:

class A { public: int x; int y; };   class B:A { public: int v; int n; };

当我们创建对象调用的时候却无法编译:

images/download/attachments/12714553/image2021-4-4_21-24-56.png

这是因为在继承的时候默认将继承过来的A的所有成员设置为private,也就是如下代码:

class A { public: int x; int y; };   class B:private A { public: int v; int n; };

而我们想要外部可以调用可以将private修改成public。

最后一个问题:私有成员是否会被继承?

class A { private: int x;   public: int y; };   class B:public A { public: int v; int n; };

以上代码B继承了A,这里A前面的public代表着,按照A的成员定义的属性继承过来,公有就是公有,私有就是私有。

而在这里我们想要确认B有没有继承A的私有成员,有2个方法:

1.查看数据宽度,显示为16

images/download/attachments/12714553/image2021-4-4_21-37-36.png

2.指针方式调用,可以成功调用获取到值

images/download/attachments/12714553/image2021-4-4_21-56-15.png

所以我们得出最终结论:父类的私有成员是可以被继承的,但是也不能直接访问。

标签:Print1,逆向,访问控制,成员,private,class,int,C++,public
From: https://www.cnblogs.com/bonelee/p/17299984.html

相关文章

  • C++逆向分析——引用
    引用类型引用类型就是变量的别名,其在初始化时必须要赋值。//基本类型intx=1;int&ref=x;ref=2;printf("%d\n",ref); //类Personp;Person&ref=p;ref.x=10;printf("%d\n",p.x); //指针类型int******x=(int******)1;int******&ref=x;r......
  • C++逆向分析——继承与封装
    面向对象程序设计之继承与封装之前已经学习过继承和封装了,但是要在实际开发中使用,光学语法和原理是不够的,在设计层面我们需要做一些优化。如下代码是继承的例子:#include<stdio.h> classPerson{public:intAge;intSex; voidWork(){printf("Person:Work()......
  • C++逆向分析——多态和虚表
    虚表上一章了解了多态,那么我们来了解一下多态在C++中是如何实现的。了解本质,那就通过反汇编代码去看就行了,首先我们看下非多态的情况下的反汇编代码:然后再来看下多态情况下的反汇编代码:很明显这里多态的情况下会根据edx间接调用,而非多态则会直接调用。那么我们来看下间接......
  • OS-Linux-Ubuntu22.04x64-Python-C++调用Python缺少Python.h
    OS-Linux-Ubuntu22.04x64-Python-C++调用Python缺少Python.h使用C或C++扩展Python扩展和嵌入Python解释器Python3.10.11Python/CAPI参考手册Python3.11.3Python/CAPI参考手册参考https://www.cnblogs.com/lidabo/p/17043302.htmlhttps://blog.csdn.net/z......
  • C++ Allocator
    C++Allocator该开始搞项目了,但是在搞项目之前,先搞一下C++的Allocator,因为项目中会用到。现在还不确定到底模仿哪个,jemalloc和tcmalloc,先看看吧。1.为什么需要Allocator其实和new/delete是等价的,但是可以屏蔽一些底层细节,因为不一定所有平台都提供统一的内存分配方式,所以需要......
  • 2023年第14届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组
    2023年第14届蓝桥杯大赛软件赛省赛C/C++大学B组试题A:日期统计(5)直接暴力,8个for+优化,2~5分钟跑完。答案:365点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10,INF=0x3f3f3f3f;intmon[]={0,31,28,......
  • C++函数重载和对象
    函数的默认参数intfun(inta,intb=10,intc=20){returna+b+c;}intmain(){cout<<fun(10)<<endl;//当参数有值时也可以输出正确,如果程序员加了返回值就用程序员加入的值。}形参的数据从左到右当中间有参数后面也需要定义一个函数和声明只能实现一个;占位参数voidfun(int*a,int......
  • 第十四届蓝桥杯大赛软件赛省赛C/C++大学生B组
    第十四届蓝桥杯大赛软件赛省赛C/C++大学生B组试题A:日期统计A题直接枚举即可,枚举日期,暴力匹配#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;boolcheck(stringt){ if(t.substr(0,4)!="2023")returnfalse; stringmon=t.substr(4,2......
  • C++多核多线程同步实现
    使用MakefileC++11工程模拟dsp的多核同步逻辑,使用多线程模拟多核,多个线程通过C++11的条件变量实现同步。当某一线程执行到同步函数syn_func时,判断是否其他线程执行到此处了,若有其他线程没有执行到此处,本线程就应阻塞。当最后一个线程执行到同步函数时,通知所有线程解除阻塞,实现......
  • C++,OpenCV图像像素运算(6)
    参与算术运算图像的数据类型、通道数目、大小必须相同算术运算加法:addvoidadd(InputArraysrc1,InputArraysrc2,OutputArraydst,InputArraymask=noArray(),intdtype=-1);/******************************************************************** src1: 输入图1* ......