Lab 2. 访问C++类中的私有成员

[ Lab截止时间:2024年3月12日前 ]

在本Lab中,你需要在类作用域外访问类中的私有成员变量和私有成员函数,在这个Lab中你会应用C++类布局相关知识。

0x0 环境准备


  1. 更新LabEnv,更新docker环境。请参考Lab1 B部分 第8小节内容

  2. 检查docker container是否正常运行

    1. sudo docker start pore_image启动docker容器

    2. sudo docker exec -it pore_image bash进入docker容器

  3. 进入虚拟机中对应路径cd ~/pore24/pore_XXXXX,其中pore_XXXXX需替换为pore_自己学号

  4. 使用git指令git pull origin master拉取本Lab的题目环境,或参考Lab1。git仓库目录应包含release_lab2,目录结构如下

可能会用到的C++知识

hint:

0x1 Task 1:连接qemu虚拟机 [ 20分 ]

  1. 进入docker container,sudo docker exec -it pore_image bash

  2. 启动qemu虚拟机,./start_vm.sh

  3. 新开一个终端,使用ssh连接qemu虚拟机,命令为ssh pore@localhost -p 6666,pore账户的密码为pore

  4. 在Linux虚拟机(MacOS/Linux用户使用物理机)中使用C/C++编写hello world程序,将hello_world.cpp复制到qemu虚拟机中,编译后的二进制文件能够正确输出Hello World!

示例步骤如下:

提交要求

  1. 使用pore用户登陆qemu虚拟机,编写HelloWorld程序,将HelloWorld程序截图放到report.docx中(10分)

  2. 在qemu虚拟机中执行二进制文件的输出截图放到report.docx中(10分)

0x2 Task 2:访问class中私有成员变量 [ 30分 ]

本任务要求在source.cpp中指定位置填写代码,在虚拟机中编译并运行,输出class A中私有变量x的值,class A成员变量的布局如下图所示。 注意: 为了避免抄袭,下发到每个同学的source.cppclass A的结构并不相同,请同学们仔细阅读自己的代码。


在task2、task3中,所有代码均在main函数中编写,请注意不要修改main函数前两行初始化内容。

在main函数中完成填写之后,应该达到如下效果: Alt text

提交要求

  1. report.docx中说明class A的内存布局,需包括每个成员变量在结构体内的偏移,并说明计算过程(20分)

  2. source.cpp的指定位置按照要求填写代码,提交source.cpp(10分)

0x3 Task 3:调用class中私有虚函数 [ 50分 ]

本任务要求在source.cpp中指定位置填写代码,在虚拟机中编译并运行,调用class A中私有成员函数getX,并将其值输出到命令行,class A成员函数的布局如下图所示。

注意: 题目中getX成员函数一定是虚函数 在main函数中完成填写之后,应该达到如下效果: Alt text

提交要求

  1. report.docx中解析调用私有函数getX的原理(如果使用到偏移,需写明偏移如何计算得出)(30分)

  2. source.cpp的指定位置填写代码,提交source.cpp(20分)

使用git提交

提交前请检查你的文件结构是否如下所示: 注意:report.docx应该包含task1,task2,task3的所有文档 请在report.docx中尽可能详细的讲述实验思路,即使没有成功的代码实现,助教组也会根据思路酌情给分