追一科技 C++ 一面

1)C++ 多态和继承

  • 继承:子类复用父类成员,表达 is-a 关系。
  • 多态:同一接口,不同实现;运行时通过基类指针/引用调用子类重写函数。
  • 条件:基类函数要加 virtual,通过指针/引用调用才是运行时多态。

2)C++ 智能指针如何自动销毁

  • 本质:RAII,智能指针对象析构时自动释放资源。
  • unique_ptr:独占所有权,离开作用域自动 delete。
  • shared_ptr:引用计数,计数为 0 时销毁对象。
  • weak_ptr:不增加引用计数,解决循环引用。

3)虚函数的作用

  • 支持运行时多态(动态绑定)。
  • 通过虚函数表 vtable 在运行时决定调用哪个重写函数。
  • 常用于接口抽象、框架扩展、解耦。

4)TCP 通过什么保证可靠传输

  • 序列号 + ACK 确认应答
  • 超时重传
  • 滑动窗口(流量控制)
  • 拥塞控制(慢启动、拥塞避免等)
  • 校验和 + 按序重组 + 去重

5)操作系统主要功能

  • 进程/线程管理(调度、同步、通信)
  • 内存管理(分页、虚拟内存)
  • 文件系统管理
  • 设备管理(I/O、中断)
  • 用户接口与系统调用
  • 安全与权限控制

6)排序算法时间复杂度(最低)

  • 基于比较的排序理论下界:O(n log n)。
  • 非比较排序(计数/桶/基数)在特定条件下可达 O(n)。

7)如何防止类被继承

  • C++11:class A final { ... };
  • 或者构造函数设为 private/protected 并限制创建(不如 final 直观)。

8)出现死锁的原因

死锁四个必要条件同时满足:

  • 互斥
  • 请求并保持
  • 不可剥夺
  • 循环等待

常见场景:线程 A 持有锁1等锁2,线程 B 持有锁2等锁1。 预防:固定加锁顺序、一次性申请资源、超时锁、死锁检测。

9)Go 中 goroutine 的底层调度

  • Go 调度模型:G-M-PG:goroutineM:内核线程P:处理器(调度上下文)
  • 调度器把大量 G 映射到少量 M 上执行。
  • 特性:工作窃取(work stealing)、抢占式调度(新版本更完善)、网络 I/O 与调度器协作(netpoll)。
  • 优势:轻量、创建快、切换成本低。

10)手撕:双栈实现队列(push / pop)

#include <stack>
#include <stdexcept>
using namespace std;

class MyQueue {
private:
    stack<int> in_st, out_st;

    void moveIfNeeded() {
        if (out_st.empty()) {
            while (!in_st.empty()) {
                out_st.push(in_st.top());
                in_st.pop();
            }
        }
    }

public:
    void push(int x) {
        in_st.push(x);
    }

    int pop() {
        moveIfNeeded();
        if (out_st.empty()) throw runtime_error("queue is empty");
        int v = out_st.top();
        out_st.pop();
        return v;
    }

    int front() {
        moveIfNeeded();
        if (out_st.empty()) throw runtime_error("queue is empty");
        return out_st.top();
    }

    bool empty() const {
        return in_st.empty() && out_st.empty();
    }
};
  • 均摊复杂度:push O(1),pop O(1)(均摊)。

11)设计一个 HTTP Server 框架(面试回答思路)

可以按分层讲:

  • 网络层:epoll + 非阻塞 socket(Reactor)
  • 协议层:HTTP 请求解析(请求行、header、body)
  • 路由层:method + path 映射 handler
  • 业务层:中间件机制(日志、鉴权、限流)
  • 并发模型:主线程 accept + 线程池处理
  • 连接管理:Keep-Alive、超时关闭
  • 稳定性:优雅退出、异常处理、监控指标(QPS、RT、错误率)
  • 可扩展:插件化 handler、配置热更新

背不下来直接说: “我会用 Reactor + 线程池做高并发网络层,上层拆协议解析、路由和中间件,保证高性能同时兼顾可维护和可扩展。”

C++面试总结 文章被收录于专栏

本专栏系统梳理C++面试高频考点,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力。

全部评论

相关推荐

本人最初是误打误撞进入了&nbsp;SRE&nbsp;这个赛道,但是也从最开始的小白一直到现在对这个领域有了一定的见解,也希望能给一些迷茫的同学分享一些经验吧,全篇大白话通俗易理解1.SRE&nbsp;岗位是干什么的大多数大厂应届生工作内容主要是:业务运维,会跟业务对接,处理业务相关的问题,处理工单,排障,做预案等,还包含&nbsp;on&nbsp;call&nbsp;值班,处理对应负责业务的告警内部平台/工具&nbsp;自动化开发,资源治理,容量规划,监控告警,CI/CD&nbsp;等等相关的开发,技术栈主要是&nbsp;Python/go,部分有可能会做&nbsp;aiops&nbsp;相关,目的基本都是提高运维效率故障演练和应急响应,进行故障演练,确保在系统出现问题时能够迅速响应和恢复2.在求职中,&nbsp;SRE和开发有什么区别?招聘投递,后端的岗位量大于&nbsp;SRE,但是后端的竞争会相当激烈,就个人经验而言,SRE&nbsp;竞争压力会小很多,而且在大厂里&nbsp;SRE&nbsp;的学历要求会低一些面试,SRE&nbsp;侧重于&nbsp;Linux&nbsp;相关(Linux&nbsp;内核、shell&nbsp;脚本、开源中间件,虚拟化等),后端开发的话技术栈更侧重于开发语言,还有就是&nbsp;SRE&nbsp;算法难度会低于后端开发薪资,对应届生而言,在大厂技术岗里,薪资主要看个人(学历,实习经历,面试表现)定级,大多数人基本都差不多,但是在顶尖那一批人里,后端开发的薪资上限会高一些希望可以给一些同学解疑答惑吧,接受&nbsp;一对一咨询
软件开发投递记录
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
01-26 13:42
网易云 客户端开发 n * 16 大专
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务