全面复习4

一、题目

要求:只能修改 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 并发请求

  1. 增加测试接口 /delay,使用非阻塞定时器延迟 100 ms 后返回,避免请求瞬间完成。
  2. 使用压测程序同时建立 10,000 条 Keep-Alive 连接,所有连接准备好后,通过 barrier 同时发送请求。
  3. 按 1,000、5,000、10,000、20,000 并发逐级加压,每档持续 1 分钟。
  4. 记录并发在途请求数、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,并观察增加核心数后吞吐能否提升,判断系统的扩展能力。

  1. 我先问一个最基本的问题,你为什么要做这个项目?
相关推荐
三月微暖寻春笋1 小时前
【和春笋一起学C++】(七十二)类模板
开发语言·c++·实例·类模板·使用类模板·数组模板
殷色玫瑰1 小时前
C++ STL:map 与 set 详解——从底层红黑树到实际应用
c语言·数据结构·c++·算法·visualstudio·rpc
Tri_Function1 小时前
背包:从入门到实战
c++
j7~2 小时前
【C++ 标准项目】发布订阅消息队列 (篇七):项目创建与基础工具模块搭建
开发语言·c++·log4j·uuid·protobuf·helper工具·消息定义类型和交换机类型定义
Lazionr2 小时前
unordered_map和unordered_set的使用
开发语言·c++·算法
进化中的刀盾兽2 小时前
从零实现 C++ Json-Rpc(九):从 TCP 字节流中拆出完整消息——MuduoBuffer 与 LVProtocol
c++·rpc
HZY1618yzh2 小时前
下一代编程语言出炉
c++·算法
wyhwust3 小时前
No1-绪论
c++
无名猿3 小时前
C++ 对象内存模型:vtable 布局、多继承 vptr、RTTI 与 dynamic_cast 走查
c++·内存管理·调试技巧·现代c++