史上最全的C++/游戏开发面试问题总结(二)——虚函数,内存,STL

笔者毕业两年,最近通过猎头拿到了腾讯游戏以及网易游戏的两个客户端研发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

http

  • 15
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值