追一科技 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++工程能力。

全部评论

相关推荐

不愿透露姓名的神秘牛友
01-26 13:42
网易云 客户端开发 n * 16 大专
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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