面向对象—大厂面试必考题,这些坑 90% 的人都踩过
- 2026-10-23 01:19:28
面向对象(OOP)绝对是 C++ 面试的 “核心考点区”!
一、核心三要素:封装、继承、多态,面试必问!
面试真题
正确答案
封装:把数据和操作数据的方法绑定在一起,隐藏内部实现细节,只暴露对外接口。示例:一个 “Person” 类,把 “姓名、年龄” 作为私有成员(private),通过 “get 姓名、set 年龄” 的公有方法(public)访问,避免数据被随意修改。
继承:子类继承父类的属性和方法,同时可以扩展自己的功能,实现代码复用。示例:“Student” 类继承 “Person” 类,继承了 “姓名、年龄” 属性,同时新增 “学号、成绩” 属性和 “选课、考试” 方法。
多态:“一个接口,多种实现”,子类重写父类方法后,父类指针可以调用子类的具体实现。示例:父类 “Shape” 有 “计算面积” 方法,子类 “Circle”“Rectangle” 重写该方法,父类指针指向不同子类对象时,自动调用对应子类的面积计算逻辑(比如 “画圆”“画矩形” 都是 “画” 的多态)。
避坑技巧
二、高频坑 1:空类默认有哪些成员函数?90% 的人答不全!
面试真题
易错答案:没有任何函数(大错特错!)
正确答案:4 个默认成员函数
默认构造函数(Empty ()):无参构造,创建对象时自动调用;
析构函数(~Empty ()):对象销毁时自动调用,释放资源;
复制构造函数(Empty (const Empty&)):用已有对象初始化新对象时调用;
赋值运算符重载(Empty& operator=(const Empty&)):对象赋值时调用(比如 a = b)。
延伸考点
避坑技巧
三、高频坑 2:struct 和 class 的区别,别再只说 “默认访问权限”!
面试真题
易错答案:struct 没有构造 / 析构函数,class 有(错!)
正确答案
核心区别:默认访问权限不同
其他共性
示例验证
// struct也能有构造和成员函数
struct Person {
string name;
// 构造函数
Person(string n) : name(n) {}
// 成员函数
void show() { cout << name << endl; }
};
// 调用完全没问题
Person p("张三");
p.show(); // 输出“张三”
避坑技巧
四、高频坑 3:虚函数的 “禁忌” 与 “代价”,这些规则别记错!
面试真题 1
正确答案
面试真题 2
正确答案:不能!虚函数有明确代价
空间开销:每个带虚函数的对象会多一个 vptr 指针(4/8 字节),指向虚函数表(vtable);
时间开销:虚函数调用需要通过 vptr 查找 vtable,比普通函数多一次间接寻址,效率略低;
适用场景:只有需要子类重写的函数才声明为虚函数(比如父类的 “计算面积” 方法),普通函数无需声明。
避坑技巧
五、高频坑 4:复制构造函数,哪些类不需要自定义?
面试真题
正确答案:C
解析
A/D:需要自定义 —— 矩阵类的动态内存、文件句柄的资源,默认复制会导致重复释放或资源冲突;
B:需要自定义 ——ID 唯一,默认复制会让两个对象 ID 相同,违反语义;
C:不需要自定义 ——string 和 vector 本身是 “成熟类”,自带正确的复制构造和赋值运算符,默认复制不会有问题。
避坑技巧
六、笔试易错点汇总(直接背!)
面向对象三大特性:封装(隐藏细节)、继承(代码复用)、多态(运行时绑定);
空类默认 4 个函数:默认构造、析构、复制构造、赋值重载;
struct 和 class 的核心区别:默认访问权限(public vs private),struct 支持构造 / 析构;
构造函数不能为虚,析构函数可以为虚(避免子类对象析构不彻底);
虚函数有开销(vptr+vtable),不能所有函数都声明为虚;
包含 string、vector 的类,无需自定义复制构造函数。
你们面试时遇到过最奇葩的问题是什么?是被笔试算法题难住,还是面谈时紧张到忘词?
是不是总觉得,职场路上总差那么一步?
✅ 想晋升,却被 “学历门槛” 卡住;
✅ 想跳槽,技能储备不够没底气;
✅ 站在职业十字路口,不知道往哪走;
✅ 投出 100 份简历,面试邀约寥寥无几……
别慌!我懂每一个职场人的挣扎与渴望,
关注我,后续持续分享「职场干货」「面试技巧」,陪你一起成长~
祝大家都能顺利通关,斩获心仪的大厂 Offer,在技术道路上越走越远!🚀