C++虚函数表面试汇总

C++面试常问问题汇总 当基类指针指向派生类的对象(多态性)时。如果定义为虚函数,则就会先调用该指针指向的派生类析构函数,然后派生类的析构函数再又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。详情可以移步:https://blog.youkuaiyun.com/jiadebin890724/article/details/7951461。 阅读详情

一般来说,对于开发者我们只需要知道虚函数的使用方法,以及虚函数表的存在即可。但面试时往往会遇到更细节的问题,比如让你实现一个虚函数机制,虽然不太实用,总归了解些底层知识也是件好事。但如果有人苦苦相逼一定要拿这个刷人,你就去骂他吧,你才是写编译器的,你们全家都是写编译器的。唉,我有些失态了...

 

1. 虚函数与虚函数表基本知识

这里有一篇介绍,只需看前两页,各种配图,很形象:http://dev.yesky.com/208/8061708.shtml

这篇文章则更精练,只需看第一段就好:http://blog.youkuaiyun.com/jiangnanyouzi/article/details/3720807

总的来说,每一个拥有virtual function的类实例化对象时,都会额外申请一块内存存储虚函数表存储所有虚函数地址,并在对象某个位置存储一个vptr指针指向该表起始地址。这个指针具体放在什么位置,虚函数表怎么组织,怎么索引各个虚函数,这些都是编译器在编译期间决定的,在不同编译环境下不见得相同。

 

2. 多态子类的调用顺序 -- 为什么不要在构造函数中调用虚函数

原因是,在子类的构造函数执行时,虚函数表还没有被子类覆盖,换句话说,此时调用的函数是当前类的函数,虚函数机制在构造函数中无法触发。其原因在于子类构造时各个初始化步骤的调用顺序:

全部推演过程见此:http://saturnman.blog.163.com/blog/static/557611201081421344244/

直接摘录构造顺序:

1.构造子类构造函数的参数

2.子类调用基类构造函数

3.基类设置vptr

4.基类初始化列表内容进行构造

5.基类函数体调用

6.子类设置vptr

7.子类初始化列表内容进行构造

8.子类构造函数体调用

(注意一点,初始化列表内的数据不按书写顺序,而是按类内部的定义顺序)

析构的顺序恰好相反,所以也不要在析构函数中调用虚函数,那样也是没有意义的。

 

3. 如何去验证虚函数表的存在

其实在第一个链接里已经有了示例程序。

如果你看不懂函数指针,请看这里:http://hi.baidu.com/homonia/blog/item/90b7a72c49c521ea8a1399e2.html

 

4. 为什么构造函数不能是虚函数

从设计理念上说,构造函数不需要是虚函数;从当前vptr的实现机制上说,无法实现虚的构造函数。

详细可见这里:http://www.diybl.com/course/3_program/c++/cppxl/2008320/105849.html

C++ 多态 虚函数 虚函数表 最是详细 高质量的C++多态讲解,详细讲解虚函数,虚函数表,虚函数继承,虚函数继承下的内存分配等 立即下载

相关推荐

uniapp监听扫码枪键盘事件|无输入框式监听

一般的扫码枪通过USB或蓝牙连接手机或电脑,充当的是一个外接设备。当扫码后,扫码枪会自动识别内容,然后向连接的电脑或手机发送键盘事件keydown或keyup。

tcy9099的专栏 9751

c++ - 虚函数表

1.什么是虚函数表 所谓虚函数表就是存放着当前类中所有虚函数地址的表。在实例化一个具有虚函数的类时,这个表 也被分配到这个实例对象的内存中,通过虚函数表可以指明所要调用的函数的位置。在C++编译器 中虚函数表的地址存放在对象的最前面,这是为了即使多继承下也能快速获取到虚函数表。 代码示例: class Base{ public: virtual void A(){cout << "Base::A()" << endl;} virtual void B(){cout &

weixin_49303682的博客 2821

学术规范与论文写作(雨课堂)研究生 全部答案

1:如何造就优秀的学术论文 论文语法判断题 :全部是错的 2:如何撰写学术论文 3: SCI论文写作经验分享 4:论文写作与投稿技巧 5:学术伦理道德 答案仅供参考,研究生生活不易,大家如果有时间的话,还是可以学习学习的,毕竟老师讲的不错。加油,希望读研的每一个人都能顺利毕业! ...

Always-Learning 13万+

C++ 多态之虚函数表

C++ 虚函数表原理剖析

索命的博客 2055

【数据攻略】字节面试真题(含答案)+100道面试题库

数据攻略

qq_40002713的博客 4104

告别命令行!用这个开源的Web版Kettle工具,5分钟搞定数据集成任务编排

本文介绍了一款开源的Web版Kettle工具,通过直观的拖拽界面大幅提升数据集成效率,告别复杂的命令行操作。该工具基于Kettle核心引擎,支持跨平台协作、轻量化访问和降低学习曲线,特别适合业务分析师快速上手。实测显示,使用该工具后任务配置错误率下降62%,协作效率提升40%。

weixin_30267785的博客 436

C++虚函数表

为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。

记录成长的博客 477

MATLAB安装

Matlab 2016a 安装包及破解教程百度云分享链接: 链接:https://pan.baidu.com/s/1i6BgD8p       密码:17gg   Matlab安装教程: 1、下载文件,得到R2016a_win64.part1.rar、R2016a_win64.part2.rar两部分安装文件和Matlab 2016a Win64 Crack破解文件。 2、解压安装文件(解...

qq_36734094的博客 17万+

C++ 虚函数表

public ://和上上个类不同的是多了一个自身定义的虚函数. 和上个类不同的是没有基类虚函数的覆盖. virtual void derive1_fun1() {} };为嘛呢?现在继承类明明定义了自身的虚函数,但不见了?类对象的大小,以及成员偏移情况居然没有变化!要注意:我为什么使用指针的方式调用?说明一下:因为如果不使用指针调用,虚函数调用是不会发生动态绑定的哦!你若直接 d1.derive1_fun1();

Cdreamfly的博客 6816

三相直流无刷电机(带HALL传感器)BLDC控制一

本案例选择TIM0的CH0/CH1/CH2三个通道接入三路原始hall输出信号。三路TIM_CHx(48)通过配置存入到NIP寄存器(new input pattern,3 bits)内。未完待续。

m0_69929716的博客 407

WPS文档中心和文档中台 operate 未授权访问漏洞(CVE-2025-0717)

WPS文档中心和文档中台的/open/v6/api/etcd/operate?key=/config/storage&method=get接口存在未授权访问漏洞,攻击者可通过该漏洞获取AK/SK密钥等信息,这些密钥通常用于系统内部认证和权限控制,泄露后可能导致攻击者进一步修改K8s配置、部署恶意容器或执行远程命令,最终实现对系统的完全控制。

李同學AI安全 905

C++多态面试题汇总

总结了一些常见的面试题,通过查阅资料给出了一些浅薄的解析,欢迎各位批评指教。

三毛创作记 3657

游戏引擎定制化:大厂如何玩转性能极限(大白话生动有趣版)

游戏大厂如何深度定制游戏引擎?本文系统解析了商业引擎的局限性及大厂定制化的核心诉求。主要内容包括: 大厂定制引擎的根本原因:性能瓶颈、差异化需求、自有生态整合等 主流引擎的优劣势对比及适用场景 定制化重点领域:渲染管线优化、物理系统重构、网络架构改造等 全流程定制方案:从需求分析到模块重构再到工具链开发 典型案例:如腾讯CF手游的渲染优化、原神的热更新系统等 文章指出,顶级游戏产品必须对引擎核心模块动刀,通过深度定制实现性能突破和创新功能开发。同时提供了风险规避建议和技术演进趋势,为游戏开发者提供了宝贵的实

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 635

C++虚函数表详细解释及实例分析

C++的虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖(override)的问题,保证其能真实的反应实际的函数。这样,在有虚函数的类的实例中这张表被分配在了这个实例的内存中,所以当我们用父类的指针操作一个子类的时候,这张虚函数表就显得尤为重要了,他就像一个地图...

雪雪 635

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++面试题目汇总(四)

C++后台开发面试常见问题汇总 C和C++语言基础 extern关键字作用 extern声明变量在在外部定义? extern修饰函数? extern C的作用?用法? static关键字作用 static修饰局部变量? static全局变量?(限定变量在一个编译单元内,一个编译单元就是指一个cpp和它包含的头文件,这个回答可以结合编译需要经历的几个过程来答) static修...

森的博客 510

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++面试常见问题:总结

一、目的: 1、想:提高C++面试常见问题 二、参考 1、C++面试常见问题 https://blog.youkuaiyun.com/u012864854/article/details/79777991 ①总结:good:适合多看,并且被问了const的作用,所以这些题目我要多看看;并且我将作者博客每个自己都总结,方便以后查看 三、问题 1、 四、 1、extern关键字的作用 extern置于变量或函数前,用于标示变量或函数的定义在别的文件中,提示编译器遇到此变...

qq_40544338的博客 2115

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++面试总结之常用基础知识

转载自:https://www.jianshu.com/p/e21d99638cf9C++程序员面试一般都是以下三板斧1.基础问答2.然后一顿虚函数、虚函数表、纯虚函数、抽象类、析构函数、拷贝构造函数3.操作数重载、STL、智能指针-------------------分割线-------------问题1,你知道虚函数吗?答案:实现多态所必须,父类类型的指针指向子类的实例,执行的时候会执行之类中...

Keep Fighting! 2万+

C++基础知识汇总

C++面试题——基础概念篇 唐璐 http://blog.youkuaiyun.com/worldwindjp/         面试C++程序员的时候一般都是3板斧,先是基础问答,然后一顿虚函数、虚函数表、纯虚函数、抽象类、虚函数和析构函数、虚函数和构造函数。接着拷贝构造函数、操作符重载、下面是STL,最后是智能指针。        都能挺过去那基本知识这关应该算是过了,下面就是项目

fei的专栏 4635

C++学习笔记

C++面试: https://blog.nowcoder.net/n/f73dc0635ae14a7e8643a9dba9b5783c https://github.com/zyy-yan/interview/blob/master/C%2B%2B%E9%9D%A2%E8%AF%95%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98.md 虚函数表:https://cloud.tencent.com/developer/article/1599283 https://www.cnblo

snowgakki的博客 217

c/c++面试题集锦

c/c++面试题集锦1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个 字符存到新文件的第一个字符,以此类推。3.main主函数执行完毕后,是否可能会再执行一段代码?4.一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?在子类的空间里,有没有父

8451

[面试]面试冲刺

介于马上要去面试了,还是恶补一下cpp吧。 虚函数表点这 虚析构函数点这 map sort/qsort点这 lockstep ecs 使用memset初始化一个类会导致类中的指针和虚函数表出现问题。相关链接 使用memset(a,1,sizeof(a))初始化a数组不会达到预期的效果,因为memset会把每个字节赋值为1就会变成16843009。 sizeof会在编译期间转化为相应的数...

weixin_30677475的博客 142

【转】C/C++ 面试题集锦

【转】C/C++ 面试题集锦 2011年07月10日   1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?   第1题:虚函数表是Compile-Time时建立的   2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个字符存到新文件的第一个字符,以此类推。   第2题:有很多不同的解法,用C还是C++、要简单还是要效率...

igf80igf 568

C++ 面向对象编程:多态相关面试简答题

摘要:本文总结了C++多态相关面试题,包括多态概念、实现原理及关键问题。多态通过虚函数表实现动态绑定,允许不同对象统一调用接口。文章详细解析了隐藏、重写和重载的区别,并解答了静态函数、内联函数、构造函数和析构函数能否作为虚函数的问题。同时探讨了虚函数效率、存储位置、菱形继承问题及虚继承原理,最后说明了抽象类的作用是强制派生类实现纯虚函数。这些内容全面覆盖了多态相关的核心知识点。

2502_90265864的博客 1106
上一篇: 数据结构 — 红黑树
下一篇: sed命令详解
define_c
博客等级 码龄14年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值