点击上方蓝字关注我,我们一起学编程
有任何疑问或者想看的内容,欢迎私信
微信搜索《编程笔记本》(codingbook2020),获取更多干活。
今天分享高德地图的C++研发岗位一面面试题。
面试题目录
文章目录
-
-
- 面试题目录
- 1.1 你对面向对象的理解是什么?
- 1.2 继承有什么原则?
- 1.3 虚函数的工作方式是什么?虚函数表和虚表指针是什么?
- 1.4 抽象类可以实例化对象吗?
- 1.5 三种继承方式的使用场景和选择原则?
- 1.6 C# 中有接口的概念,那么在 C++ 中哪种行为体现了接口的特性?
- 1.7 重写和重载的区别是什么?
- 1.8 哪些类函数需要设置成虚函数?怎么判断一个函数是否需要声明为虚函数?
- 1.9 基类指针操作基类对象,基类指针操作派生类对象,派生类指针操作基类对象,派生类指针操作派生类对象,操作同名函数时是什么样的情况?
- 1.10 C++ 的虚拟内存分布?
- 1.11 你了解过 STL 的哪些容器,以及其使用的场景和区别?
- 1.12 vector 中扩容的原理和具体实现方式?
- 1.13 map 和 unordered map 的底层实现和性能区别是什么?它们在获取元素和增删元素时有什么区别?
- 1.14 了解过哪些排序算法?
- 1.15 设计数据库有哪些原则?如何设计一个表?
- 1.16 怎么提高数据库的 i/o 速度?
- 1.17 了解对线程吗?
- 1.18 了解过范式吗?
- 1.19 了解二叉树的遍历吗?
-
1.1 你对面向对象的理解是什么?
面向对象是向现实世界模型的自然延伸,这是一种万物皆对象的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,可以概括为:程序=对象+消息。
面向对象有三大特性:封装、继承、多态。
封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这样做使得代码的复用性更高。
继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类——有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性。
多态的一大作用就是为了解耦——为了解除父子类继承的耦合度。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。
总结来说,封装和继承是面向对象的基础,多态是面向对象最精髓的理论。
1.2 继承有什么原则?
- 公有继承时:水平访问和垂直访问对基类中的公有成员不受限制
- 保护继承时:对于垂直访问同于公有继承,对于水平访问同于私有继承
- 私有继承时:水平访问和垂直访问对基类中的公有成员也不能访问
对于基类中的私有成员,只能被基类中的成员函数和友元函数所访问,不能被其他的函数访问。基类与派生类的关系:任何一个类都可以派生出一个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的。
1.3 虚函数的工作方式是什么?虚函数表和虚表指针是什么?
C++ 中虚函数的实现一般是通过虚函数表实现的。类的虚函数表是一块连续的内存,每个内存单元中记录一个 JMP 指令的地址,也就是每个虚成员的地址。编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。 虚表指针就是指向虚函数表的指针。
更多关于虚函数的内容参见往期笔记:【面经】CVTE–C++软件开发@一面的面试题1.2 。
1.4 抽象类可以实例化对象吗?
抽象类可以有自己的构造方法,但是不能直接通过 new 进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。
1.5 三种继承方式的使用场景和选择原则?
- public(公有继承):继承时保持基类中各成员属性不变,并且基类中 private 成员被隐藏。派生类的成员只能访问基类中的 public/protected 成员,而不能访问 private 成员;派生类的对象只能访问基类中的 public 成员。
- private(私有继承):继承时基类中各成员属性均变为 private ,并且基类中 private 成员被隐藏。派生类的成员也只能访问基类中的 public/protected 成员,而不能访问 private 成员;派生类的对象不能访问基类中的任何的成员。
- protected(保护继承):继承时基类中各成员属性均变为 protected ,并且基类中 private 成员被隐藏。派生类的成员只能访问基类中的 public/protected 成员,而不能访问 private 成员;派生类的对象不能访问基类中的任何的成员。
1、不管采用哪种形式(public, protected 或 private),基类中的私有成员都不可以直接访问;如果非要在派生类中使用基类的私有成员,可以有两种方法:一是使用属性,二是使用友元类或友元函数。
2、如果采用 public 形式,则基类除了私有成员的其它所有都被原样的继承到派生类中;即在基类中是 publi