C/C++面试八股题(二)
更多专栏:
超详细的嵌入式面经专栏(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz
校招公司汇总专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp
目录:
1.请你说说虚函数的是怎样工作的,大概流程是什么?
2.什么是纯虚函数?有什么作用?
3.什么是多态?多态是需要满足的条件以及优缺点是什么?
4.什么是继承,继承是如何实现的?
5.什么是虚继承,如何实现的?
6.什么是构造函数?
7.什么是析构函数?
8.构造函数和析构函数在继承中的情况?
内容:
1.请你说说虚函数的是怎样工作的,大概流程是什么?
- 定义虚函数首先,在基类中使用关键字virtual来声明一个虚函数。
- 继承和重写(覆盖)虚函数当一个类继承自包含虚函数的基类时,派生类可以选择重写(覆盖)基类中的虚函数。
- 通过基类指针或引用调用虚函数(多态性体现)
- 虚函数表(v - table)机制当一个类包含虚函数时,编译器会为这个类创建一个虚函数表。虚函数表是一个函数指针数组,其中每个元素指向一个虚函数的实现。对于每个包含虚函数的类的对象,对象内存布局的开头会有一个隐藏的指针(通常称为vptr),它指向类的虚函数表。当通过基类指针或引用调用虚函数时,程序会根据对象的vptr找到对应的虚函数表,然后在虚函数表中查找并调用正确的函数。
- 动态绑定和多态当子类继承了父类的时候,子类对象也会继承父类的虚函数表。当子类重写(override)父类中的虚函数时,会将虚函数表中对应的函数地址替换为子类的虚函数地址,从而实现了动态绑定和多态。
2.什么是纯虚函数?有什么作用?
- 纯虚函数是在基类中声明但没有提供实现的虚函数。它的声明形式为在函数原型后面加上
= 0
。例:
class Shape { public: virtual double area() = 0; // 这是一个纯虚函数,意味着在Shape类中没有area函数的具体实现 };
- 纯虚函数在基类中起到以下作用:
- 接口定义:纯虚函数主要用于定义接口。它可以让多个不同的派生类遵循相同的函数接口规范,使得程序能够以统一的方式处理不同类型的对象。例如,在图形处理程序中,可以有多种图形(如圆形、三角形等),通过定义
Shape
抽象类中的纯虚函数area
,可以确保每个图形类都有计算面积的功能,并且接口统一。 - 多态性和抽象设计:可以通过基类指针或引用调用纯虚函数,根据对象的实际类型(在运行时确定)来执行相应派生类中的函数实现。这种抽象设计方式可以提高代码的可维护性和可扩展性。例如:在一个绘图系统中,可能会有一个函数接收
Shape
类型的引用,然后调用area
函数来计算要绘制的图形的面积,不管这个图形是矩形、圆形还是其他自定义的图形,只要它是Shape
的派生类并且正确实现了area
函数,这个函数都能正确工作。
3.什么是多态?多态是需要满足的条件以及优缺点是什么?
多态是面向对象编程中的一个重要概念,多态就是不同对象对同一行为会有不同的状态。
是指在面向对象编程中,子类对象可以以父类引用的方式存在,从而实现用父类接口调用子类方法的功能。
- 例如,有一个 “动物” 基类,它有 “发出声音” 的行为。“狗”和“猫” 是 “动物” 的派生类,它们都继承了 “发出声音” 这个行为。但是狗的叫声是 “汪汪”,猫的叫声是 “喵喵”。当使用一个统一的方式(比如调用 “发出声音” 这个函数)来处理狗和猫的对象时,它们会表现出不同的行为,这就是多态。
实现多态需要满足的条件:
- 虚函数:基类中被派生类重写的函数必须被声明为虚函数。使用virtual关键字来定义虚函数。
- 继承关系:存在基类(父类)和派生类(子类)之间的继承关系。
- 基类指针或引用调用虚函数:可以创建基类指针或引用,让它们指向派生类对象,然后通过这些指针或引用调用虚函数。在运行时,会根据对象的实际类型来调用相应的函数。
优点:
- 提高代码的可维护性和可扩展性,使代码可以重复利用,并且易于添加新功能。
- 增强程序的灵活性和通用性,统一接口处理多种类型。
缺点:
- 性能开销较大,存在虚函数表和虚指针对内存占用,并且动态绑定的时间成本。
- 增加代码的复杂性,多态的实现涉及到虚函数、派生类的重写、基类指针或引用等概念,这使得代码的结构和逻辑相对复杂。
4.什么是继承,继承是如何实现的?
- 继承是面向对象编程中的一个重要概念,它允许创建一个新类(称为派生类或子类),这个新类可以从一个现有的类(称为基类或父类)获取属性(成员变量)和行为(成员函数)。这就好比子女继承父母的特征一样,派生类继承基类的特性,并且可以在这个基础上添加新的属性和行为,或者修改从基类继承来的属性和行为。
- 继承的实现语法格式使用:(冒号)和public(或private、protected)关键字来实现继承。public表示公有继承,private表示私有继承,protected表示受保护继承。例如:
class Vehicle { // 基类
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式/C++八股 文章被收录于专栏
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新