笔者毕业两年,最近通过猎头拿到了腾讯游戏以及网易游戏的两个客户端研发offer(UE4/C++)。在面试前夕,笔者对C++进行了较为全面的复习和总结,乐观估计可以涵盖80%左右的面试基础问题。
这个系列的文章预计有《C++基础》、《内存、STL、虚函数相关》、《数据结构与算法》、《操作系统与网络》四篇(当前是第二篇),每篇都是以问答的形式分享并给出了参考资料的链接地址。大部分问题回答的比较简洁,需要大家去仔细阅读参考资料的具体内容,当然也可以直接问我~
文中涉及到很多书籍与资料,可以关注公众号获取。
虚函数机制相关
问:virtual function的优缺点(提问概率:★★★★)
优点:实现多态
缺点:MFC中的消息机制以及Qt中都没有采用C++中的虚函数机制,原因大概如下~
1.在子类很少覆盖基类函数实现的时候内存开销太大,每个类需要产生一张虚表,每生成一个对象的时候,需要在对象里存放一个vptr。
2.基类指针指向派生类对象的情况下,无法内联优化
3.在执行效率上肯定多了一些开销,需要寻找函数地址4.虚表的存在可能破坏一些封装安全,可以通过vptr绕过private的限制
参考书籍与资料:《C++ Primer》《The Design and Evolution of C++》(C++语言的设计与演化)
问:多继承的优缺点(提问概率:★★★)
好处:简单来讲就是为了实现多个基类特有的功能
缺点:菱形继承;二义性
参考书籍与资料:《C++ Primer》《The Design and Evolution of C++》(C++语言的设计与演化)
问:为什么要用virtual destructor?为什么没有virtual constructor?(提问概率:★★★★)
第一点,构造函数执行前,对象的内存信息都没有,vptr也没有初始化,如何找到虚函数表,实现虚调用。其次,需要理解虚函数的意义,他是为了实现多态,让子类去覆盖父类的操作,但是前提是你需要知道当前的类型是什么,而C++里面构造函数可以说决定了他的类型。另外,构造函数与析构函数的执行不同,他是从父类开始一步一步的构造成一个子类(即使父类没有构造函数也可能会被编译器合成一个),所以你不能跳过父类的构造函数,子类的很多成员可能需要在父类的基础上去初始化。
不过,从设计的角度来考虑的话,虚构造的思想还是有意义的,和我们设计模式中的工厂模式有点类似。我们希望不受语言的限制,在声明的时候直接自动的调用子类的构造函数,参考Delphi语言。
参考书籍与资料:构造函数不能是虚函数? https://www.zhihu.com/question/35632207/answer/63936329
问:类的内存布局是什么样的?考虑有虚函数、多继承、虚继承几种情况。(提问概率:★★★★★)
简单总结一下就是类只有成员变量占用内存(静态成员不占类内部内存,函数不占内存)。如果有虚函数,每个类对象都会有一个虚函数指针Vptr(占用一个指针大小的内存),vptr指向一个虚函数表,表里面记录了各项标记virtual的函数,子类如果覆盖父类虚函数,对应虚表位置的虚函数会被子类的替换(虚表在运行时其位置与大小就被决定了,一个类只有一个虚表)
https://www.cnblogs.com/demian/p/6538301.html,侵删
单继承GrandChild->Child-> Parent
多继承Derive->Base1Derive->Base2; Derive->Base1
多继承菱形继承D->Base1 D->Base2;Base1->B; Base2->B
多继承菱形虚继承D->Base1 D->Base2;Base1->B; Base2->B
参考书籍与资料:《The Design and Evolution of C++》(C++语言的设计与演化)《Inside the C++ Object Model》(深度探索C++对象模型)
虚继承及继承的内存布局
https://www.cnblogs.com/demian/p/6538301.html
问:dynamic_cast是怎么实现的(提问概率:★★★★)
dynamiccast属于RTTI,运行时类型识别的一个内容,他是c++realise1.0的主要扩充功能之一。主要内容是typeid与typeinfo的实现,基本思路就是在有虚函数的类的虚表的头部位置存放RTTI的相关信息。在VC里面可以看到是一个叫做RTTI Complete Object Locator的结构体里面存放相关的信息。在强转的时候,会读取里面对应的类的信息进而判断是否能转换成功
参考书籍与资料:《The Design and Evolution of C++》(C++语言的设计与演化)
c _rtti机制深度剖析 http://www.docin.com/p-1097232112.html
Classes, Methodsand RTTI
http://www.openrce.org/articles/full_view/23
Visual C++ RTTI Inspection