畅唐网络 C++开发 一面
1. C++ 的三大特性
答案:C++ 的三大特性一般指封装、继承、多态。封装是把数据和操作数据的方法放在一起,同时通过 public、protected、private 控制访问权限,隐藏实现细节。继承是子类复用父类的属性和行为,减少重复代码,也方便做层次化设计。多态是同一个接口在不同对象上表现出不同的行为,常见的是通过虚函数实现运行时多态。这三者结合起来,核心价值就是提高代码复用性、扩展性和维护性。
2. 菱形继承的缺点?如何解决?
答案:菱形继承指的是一个子类同时继承两个父类,而这两个父类又继承自同一个基类。它最典型的问题就是数据冗余和二义性。子类对象里可能会有两份共同基类的数据,访问共同基类成员时编译器也可能不知道该走哪条继承路径。解决方式一般是虚继承,也就是让中间两个父类在继承共同基类时使用 virtual,这样最底层子类里只会保留一份共同基类子对象。
代码:
#include <iostream>
using namespace std;
class A {
public:
int x;
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
int main() {
D d;
d.x = 10; // 不会有二义性
cout << d.x << endl;
return 0;
}
3. 多态是什么?怎么实现的?
答案:多态就是同一个接口,针对不同对象表现出不同的行为。在 C++ 里,多态分编译时多态和运行时多态。编译时多态主要是函数重载和模板,运行时多态主要是继承加虚函数。面试里一般重点问运行时多态。它的实现依赖虚函数表和虚表指针。带虚函数的类通常会有虚函数表,对象内部一般会有虚表指针,通过父类指针或引用调用虚函数时,会根据对象真实类型在运行时决定调用哪个函数。
代码:
#include <iostream>
using namespace std;
class Base {
public:
virtual void print() {
cout << "Base" << endl;
}
virtual ~Base() {}
};
class Derived : public Base {
public:
void print() override {
cout << "Derived" << endl;
}
};
int main() {
Base* p = new Derived();
p->print();
delete p;
return 0;
}
4. C++11 的新特性有哪些?
答案:C++11 的新特性很多,面试里比较常问的有这么几类。首先是语言层面,像 auto、decltype、范围 for 循环、右值引用、nullptr、final、override、列表初始化、lambda 表达式。其次是内存和资源管理层面,引入了智能指针,比如 unique_ptr、shared_ptr、weak_ptr。并发编程也是重点,像 thread、mutex、condition_variable、原子变量这些都在 C++11 标准里得到了支持。另外还有移动语义、完美转发、unordered_map、unordered_set、emplace_back 等。如果面试官让你挑重点讲,一般把右值引用、移动语义、智能指针、lambda、多线程这几块说清楚就够了。
5. C++ 内存分布
答案:C++ 程序运行时,内存大致可以分成代码区、全局/静态区、常量区、栈区、堆区。代码区存放程序机器指令;全局/静态区存放全局变量和静态变量;常量区一般放字符串常量这类只读数据;栈区由编译器自动管理,主要放局部变量和函数参数;堆区由程序员手动申请和释放,或者由容器和智能指针管理。面试里说这个问题时,一般还会顺带提一下栈内存分配快但空间小,堆内存灵活但容易出现泄露和碎片。
6. 什么是内存泄露?
答案:内存泄露就是程序申请了内存,但后面不再使用这块内存时,没有及时释放,导致这块内存一直无法被回收。如果泄露不断累积,程序占用的内存会越来越大,严重时可能导致性能下降、系统卡顿,甚至进程被
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.