一、题目
要求:只能修改 main() 函数内部代码,使控制台输出 A::sex。
#include <iostream>
using namespace std;
class person {
public:
virtual void name() {
cout << "A::name" << endl;
}
private:
virtual void sex() {
cout << "A::sex" << endl;
}
};
class student : public person {
public:
virtual void name() {
cout << "B::name" << endl;
}
};
int main() {
student s;
// 要求:仅修改main函数内部代码
// 实现控制台输出:A::sex
return 0;
}
二、面试参考答案:通过虚函数表调用
int main() {
student s;
// 1. 获取对象中的虚函数表指针
void** vtable = *reinterpret_cast<void***>(&s);
// 2. 定义函数指针类型
using Func = void (*)(person*);
// 3. 获取虚函数表中第二个虚函数的地址
Func f = reinterpret_cast<Func>(vtable[1]);
// 4. 调用 person::sex()
f(&s);
return 0;
}
输出:
A::sex
为什么做客户端开发
我选择客户端开发,主要是因为它既贴近用户,又有较强的技术深度。客户端功能和性能优化能够直接反映到用户体验上,反馈比较及时
讲一下C++的拷贝构造,拷贝构造函数跟拷贝构造运算符有什么区别
拷贝构造函数用于用一个已有对象初始化一个新对象,形式通常是:
T(const T& other);
例如:
T a;
T b = a; // 调用拷贝构造函数
拷贝赋值运算符用于把一个已有对象赋值给另一个已经存在的对象,形式通常是:
T& operator=(const T& other);
例如:
T a, b;
b = a; // 调用拷贝赋值运算符
核心区别是:拷贝构造负责创建并初始化新对象;拷贝赋值负责覆盖已有对象。
即使写成 T b = a,这里也是拷贝构造,不是赋值运算符。拷贝赋值通常还要处理自赋值,并返回 *this。如果类管理堆内存等资源,两者一般都需要实现深拷贝。
讲一下你是怎么去涉及新领域新知识的,讲一下怎么获取知识的,然后遇到了什么困难,取得了什么成果,在学习过程中有没有遇到假信息?你是怎么去排除的?
B站或者博客都有一些新领域的一些相关学习资料,了解一下基本概念以及使用,遇到一些不懂的再用AI 辅助细节方面的理解学习;学习过程中会通过写 Demo、和总结笔记来验证理解。
学习中确实会遇到资料过时、概念混淆甚至错误信息。我过官方文档博客等地方查找,写个测试用例进行验证;
计算机网络了解多少
在传输层,了解 TCP 的三次握手、四次挥手、可靠传输、滑动窗口、流量控制和拥塞控制,也了解 UDP 的特点和适用场景。应用层方面,掌握 HTTP/1.0、HTTP/1.1、HTTP/2 的主要区别,以及 HTTPS 的 TLS 加密过程。
- 数据链路层:局域网内部节点之间的通信,使用 MAC 地址,以帧为单位。
- 网络层 :负责不同网络之间主机到主机的通信,以 IP 数据包为单位,根据 IP 地址进行路由和转发。
例如数据经过多个路由器时,IP 数据包基本保持不变,但每经过一跳,都会重新封装成新的链路层帧。
在 Linux 网络编程中,了解 Socket 通信流程,以及 select、poll、epoll 等 I/O 多路复用技术,并接触过 Reactor 事件驱动模式。
Linux常用命令
我平时主要按功能使用 Linux 命令:
- 文件与目录 :
pwd、ls、cd、mkdir、cp、mv、rm、find - 文本和日志 :
cat、less、head、tail、grep - 进程管理 :
ps、top、kill、jobs - 网络排查 :
ping、curl、 - 磁盘和权限 :
df、du、chmod、chown - 压缩和编译 :
tar、g++. ``make - 调试分析 :
gdb
例如查看进程和端口、跟踪日志、搜索错误信息,以及编译调试 C++ 程序时,都会经常用到这些命令。
你的服务器每分钟处理约 35 万次请求、吞吐量约 250 KB/秒。仅凭这些数据能证明系统是高并发吗?应该如何设计压测?
可以设计一个"同时在途请求"的测试,而不是只看总请求数。
测试用例:10,000 并发请求
- 增加测试接口
/delay,使用非阻塞定时器延迟 100 ms 后返回,避免请求瞬间完成。 - 使用压测程序同时建立 10,000 条 Keep-Alive 连接,所有连接准备好后,通过 barrier 同时发送请求。
- 按 1,000、5,000、10,000、20,000 并发逐级加压,每档持续 1 分钟。
- 记录并发在途请求数、RPS、平均延迟、P95/P99 延迟、超时率、错误率,以及 CPU、内存、线程池和连接数。
例如使用 wrk:
wrk -t8 -c10000 -d60s --latency http://127.0.0.1:8080/delay
判定标准可以是:10,000 个请求能够同时在服务端处理,错误率低于 0.1%,P99 延迟在目标范围内,CPU、内存和连接数没有异常增长,持续压测期间没有崩溃或请求堆积。
同样的负载下,48 核 96GB 与 2 核 6GB 的机器都能达到这一处理能力,哪个更能说明系统性能?为什么?
在请求内容、吞吐量、延迟和错误率相同的前提下,2 核 6GB 更能体现系统的资源利用效率,因为它用更少的硬件完成了相同的工作,单位资源的处理能力更强。
但同样负载下都达标,不能说明两台机器的性能上限相同,48 核机器可能还有大量余量。要进一步比较,应逐步加压,测量满足延迟和错误率要求时的最大稳定 QPS,并观察增加核心数后吞吐能否提升,判断系统的扩展能力。
- 我先问一个最基本的问题,你为什么要做这个项目?