华云三维科技 C++开发
基本看简历问的 无手撕
1. 自我介绍
2. 介绍一下虚函数
答案:虚函数是 C++ 实现运行时多态的核心机制。当基类把某个成员函数声明为 virtual 之后,子类就可以重写它。通过基类指针或引用调用这个函数时,最终执行的是对象真实类型对应的版本,而不是指针静态类型对应的版本。底层通常依赖虚函数表和虚表指针来完成动态分发,所以它带来的好处是接口统一、扩展方便,代价是对象里通常会多一个虚表指针,并且调用时多一次间接寻址。如果一个类会被当作基类使用,析构函数一般也应该声明成虚函数,否则通过基类指针删除派生类对象时容易出问题。
代码:
#include <iostream>
using namespace std;
class Base {
public:
virtual void show() { cout << "Base\n"; }
virtual ~Base() = default;
};
class Derived : public Base {
public:
void show() override { cout << "Derived\n"; }
};
int main() {
Base* p = new Derived();
p->show();
delete p;
return 0;
}
3. 派生类和基类可以互相转换吗,转换时内存层面怎么理解
答案:派生类对象可以向上转型成基类指针或引用,这种转换通常是安全的,因为派生类对象里本来就包含一个基类子对象。反过来,基类指针不能随便直接当成派生类指针使用,因为基类对象未必真的就是那个派生类实例。如果强转错了,访问派生类新增成员时就是未定义行为。从内存布局上看,单继承场景下,派生类对象通常会先放基类部分,再放自己扩展的成员,所以向上转型很多时候只是不需要额外改动或者做一个固定偏移。多继承场景就会复杂一些,不同基类子对象在同一个对象里的位置可能不同。如果需要在运行时判断一个基类指针是否真的指向某个派生类,通常用 dynamic_cast。
代码:
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base() = default;
};
class Derived : public Base {
public:
void work() { cout << "Derived::work\n"; }
};
int main() {
Base* p = new Derived();
if (Derived* d = dynamic_cast<Derived*>(p)) {
d->work();
}
delete p;
return 0;
}
4. 数组和链表的区别
答案:数组的特点是连续存储,支持通过下标快速访问,缓存局部性也比较好,所以遍历通常很快。链表的特点是节点分散存储,插入和删除某个已知位置的节点比较方便,不需要像数组那样整体搬移元素。但如果从真实机器执行效率看,很多场景下数组或者 vector 会比链表更快,因为链表访问时会频繁跳地址,缓存命中率不高。所以这题不只是答“数组查找快、链表插入快”,更重要的是知道连续内存、缓存局部性和实际工程中的取舍。
5. 智能指针有哪些,使用时要注意什么
答案:常见智能指针有 unique_ptr、shared_ptr 和 weak_ptr。unique_ptr 表示独占所有权,语义最清晰,开销也比较小;shared_ptr 通过引用计数实现共享所有权;weak_ptr 不参与对象拥有关系,主要用来观察 shared_ptr 管理对象的生命周期。使用时最需要注意的是所有权设计,不要一上来就全用 shared_ptr。如果对象的拥有关系明确,优先用 unique_ptr;如果存在循环引用风险,要用 weak_ptr 打破环。另外还要注意不要从同一个裸指针重复构造多个 shared_ptr,否则会形成多个控制块,最后重复释放。
代码:
#include <memory>
using namespace std;
struct B;
struct A {
shared_ptr<B> b;
};
struct B {
weak_ptr<A> a;
};
int main() {
auto pa = make_shared<A>();
auto pb = make_shared<B>();
pa->b = pb;
pb->a = pa;
return 0;
}
6. set 能存自定义类型吗,需要注意什么
答案:可以。set 底层通常是有序关联容器,插入元素时需要比较大小,所以自定义类型要能提供严格弱序关系。最常见的做法是重载 operator<,或者在模板参数里传入自定义比较器。需要注意的是,这个比较逻辑不仅决定排序顺序,还决定元素是否被认为“相等”。如果两个对象互相都不小于对方,set就会把它
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.
查看20道真题和解析