C++逆向分析——类成员的访问控制
类成员的访问控制
课外 → 好的编程习惯:定义与实现分开写,提升代码可读性。
如下代码,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的时候就会发现无法编译:
private(私有)、public(公有)的使用总结:
-
对外提供的函数或者变量,定义成public,不能随意改动
-
可能会改动的函数或者变量,定义成private,使用时编译器会检测
-
只有当前结构体内部函数才可以访问private的成员
-
private、public可以修饰函数或者变量
那么问题来了,private修饰的函数或者变量真的不能访问吗?并不是,只是我们没有办法通过正常的方式去使用,但是我们可以使用指针的方式去调用:
那就说明private修饰的成员与普通成员没有区别,只有编译器会检测。
自己vs2022测试下:
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> class Person { private : int age; int sex; public : Person( int a, int b) { age = a; sex = b; } }; void main() { Person tom(100, 1); int * p = ( int *)&tom; printf ( "%d %d\n" , p[0], p[1]); return ; } |
在我的vs2022里,运行下看看tom这个局部变量存放的地址:
是从ebp-c开始的,不是ebp-4,也不是ebp-8!
从这节课开始我们不再使用struct作为类的创建,而是直接使用class关键词,其使用没有什么区别,唯一的区别在于成员默认访问属性不一样,在struct中所有成员默认的属性是public,而在class中则相反:
除此之外还有一个就是在继承时的区别,我们可以将一个正常的struct继承修改成class:
class
A {
public
:
int
x;
int
y;
};
class
B:A {
public
:
int
v;
int
n;
};
当我们创建对象调用的时候却无法编译:
这是因为在继承的时候默认将继承过来的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
2.指针方式调用,可以成功调用获取到值
所以我们得出最终结论:父类的私有成员是可以被继承的,但是也不能直接访问。(当然,使用前面指针的方式是可以访问的)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2020-04-09 OWASP TOP10 Web应用十大安全风险_2017
2020-04-09 移动互联网恶意程序描述格式 ——移动端恶意软件分类再合适不过了
2020-04-09 用短信传播病毒:最新Android手机勒索软件Koler
2020-04-09 2019年Android恶意软件专题报告:未来移动安全呈现四大趋势——资费消耗与隐私窃取分别以高达46.8%和41.9%的占比,成为横行无忌的主要恶意软件类型,其次分别为远程控制、流氓行为、恶意扣费和欺诈软件。
2020-04-09 2018年Android恶意软件专题报告
2020-04-09 浅析Android恶意应用及其检测技术
2020-04-09 Android恶意软件特征及分类