米哈游 客户端开发-C++ 一面

1. C++ 里的多态是什么?编译期多态和运行时多态有什么区别?

多态可以理解为“同一个接口,不同实现”。 编译期多态在编译阶段确定调用目标,常见形式是函数重载、模板;运行时多态在程序运行时根据对象真实类型决定调用目标,依赖虚函数机制。

#include <iostream>
using namespace std;

struct Base {
    virtual void foo() { cout << "Base\n"; }
};
struct Derived : Base {
    void foo() override { cout << "Derived\n"; }
};

void func(int) { cout << "int\n"; }
void func(double) { cout << "double\n"; }

template <typename T>
void tfunc(T) { cout << "template\n"; }

int main() {
    Base* p = new Derived();
    p->foo();    // 运行时多态
    func(1);     // 编译期多态(重载)
    tfunc(3.14); // 编译期多态(模板)
    delete p;
}

如果你也学C++ , 可能你需要一份完整的C++ 面试题: C++ 常考面试题总结

2. 重写和重载有什么区别?

重写发生在继承关系中,子类重写父类的虚函数,函数签名要匹配。 重载发生在同一作用域,函数名相同但参数列表不同。

struct Base {
    virtual void f(int) {}
};

struct Derived : Base {
    void f(int) override {} // 重写
    void f(double) {}       // 重载
};

3. 什么是虚函数?纯虚函数和虚函数有什么区别?

虚函数用于支持运行时多态。 纯虚函数写成 =0,用于定义接口;含纯虚函数的类是抽象类,不能直接实例化。

struct Shape {
    virtual double area() = 0;
    virtual ~Shape() = default;
};

struct Circle : Shape {
    double r;
    explicit Circle(double rr) : r(rr) {}
    double area() override { return 3.14159 * r * r; }
};

4. 说说 C++ 的 RAII

RAII 的核心是:资源由对象管理。 对象创建时获取资源,对象销毁时自动释放资源。常用于锁、文件句柄、堆内存管理,能有效减少泄漏问题。

#include <mutex>
std::mutex mtx;

void safeFunc() {
    std::lock_guard<std::mutex> lk(mtx); // 离开作用域自动解锁
}

5. unique_ptr、shared_ptr、weak_ptr 区别是什么?

unique_ptr 独占所有权,不能拷贝,可以移动。 shared_ptr 共享所有权,使用引用计数。 weak_ptr 不参与引用计数,常用于解决循环引用。

#include <memory>
using namespace std;

struct Node {
    shared_ptr<Node> next;
    weak_ptr<Node> prev;
};

6. new/delete 和 malloc/free 的区别?

new/delete 是 C++ 运算符,会调用构造和析构。 malloc/free 是 C 库函数,只做内存分配和释放,不负责对象生命周期。

7. C++ 的 move 语义是什么?

move 语义通过右值引用转移资源所有权,减少不必要的深拷贝,提高性能。 常用 std::move 把左值显式转换为右值引用。

#include <vector>
#include <string>
using namespace std;

int main() {
    string s = "hello";
    vector<string> v;
    v.push_back(std::move(s));
}

8. C++ 内存分区有哪些?

常见有:代码区、全局/静态区、常量区、栈区、堆区。 栈由系统自动管理;堆通常由程序动态申请和释放。

9. 什么是哈希表?

哈希表通过哈希函数把键映射到桶位置,实现平均 O(1) 的查找、插入和删除。 冲突处理常用链地址法或开放定址法,装载因子高时会扩容。

10. 哈希表中键值能不能是一个对象?要满足什么条件?

可以。通常需要: 1) 可比较相等; 2) 可计算哈希值; 3) 作为 key 使用期间,影响哈希/相等判断的

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

评论
点赞
4
分享

创作者周榜

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