热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

【面经笔记】虚函数表指针个数

本文参考了http:www.cnblogs.comjerry19880126p3616999.html上述博客给出了以下结论:每个类都有虚指针和虚表;如果不是虚继承,那么

本文参考了

http://www.cnblogs.com/jerry19880126/p/3616999.html

上述博客给出了以下结论:

  1. 每个类都有虚指针和虚表;
  2. 如果不是虚继承,那么子类将父类的虚指针继承下来,并指向自身的虚表(发生在对象构造时)。有多少个虚函数,虚表里面的项就会有多少。多重继承时,可能存在多个的基类虚表与虚指针;
  3. 如果是虚继承,那么子类会有两份虚指针,一份指向自己的虚表,另一份指向虚基表,多重继承时虚基表与虚基表指针有且只有一份。

我觉的上述博客中结论有些不妥,自己做了实验进行验证,记录如下:


添加新虚函数

首先看一下普通继承下,子类中定义新的虚函数会发生什么:

子类B中没有定义新虚函数:
这里写图片描述

子类B中定义新虚函数:
这里写图片描述

红色框区域可知,新定义的虚函数和基类的虚函数保存于一个虚函数表,虚函数指针个数没有改变


再看一下虚继承

这里写图片描述

对比第一幅图和这幅图,可知虚继承中会多一个vbptr指针,它不是虚函数表指针。
为什么这里会出现vbptr,因为虚基类派生出来的类中,虚基类的对象不在固定位置(应该是在尾部),需要一个中介才能访问虚基类的对象.所以子类需要有一个vbptr,对应的table中需要有一项指向虚基类.
http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html


虚继承下,子类中定义新的虚函数

这里写图片描述

对比第二幅图和这幅图,可知虚继承下添加新的虚函数,会新添加新的虚函数表和虚函数指针,即基类的虚函数表中的函数是不增加的。


至此,可知:虚基类的虚函数表是不能加入新虚函数的,而普通基类的虚函数表是可以增加新的虚函数。

在子类中没有增加新的虚函数时,虚函数表指针不变;

当子类中增加新的函数时,虚继承的子类会增加一个虚函数表用于保存新的虚函数,故会多一个虚函数表指针。


非虚多重继承:

这里写图片描述

非虚多重继承会将所有基类的虚函数表继承下来。新增加的虚函数会增加到继承顺序第一的基类的虚函数表中。


多重虚继承:

这里写图片描述

由于定义了新的虚函数而两个基类都是虚继承,所以需要新建虚函数表:故共有两个基类虚函数表指针,一个新的虚函数表指针。


钻石继承:

这里写图片描述

从前面实验可知:B、C均有两个虚函数表指针

对于D:由于虚基类的虚函数表只会存在一份,所以D会有一个A类的虚函数表指针,并有B、C基类的虚函数表指针。共3个指针。

D中新加的虚函数会添加到B基类的虚函数表中,不会增加虚函数表指针个数。


推荐阅读
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • WCF类型共享的最佳实践
    在使用WCF服务时,经常会遇到同一个实体类型在不同服务中被生成为不同版本的问题。本文将介绍几种有效的类型共享方法,以解决这一常见问题。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • 短暂的人生中,IT和技术只是其中的一部分。无论换工作还是换行业,最终的目标是成功、荣誉和收获。本文探讨了技术人员如何跳出纯技术的局限,实现更大的职业发展。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 在软件企业中,开源节流是管理层共同关注的重点。作为技术总监,我在产品和技术运营层面深入探讨了这一问题,旨在通过技术创新和优化流程来实现成本控制和效益提升。本文将详细分析CTO在开源节流中的核心作用及其具体策略。 ... [详细]
  • 为了提升单位内部沟通效率,我们开发了一套飞秋软件与OA系统的消息接口服务系统。该系统能够将OA系统中的审批、通知等信息自动同步至飞秋平台,确保员工在使用飞秋进行日常沟通的同时,也能及时获取OA系统的各类重要信息,从而实现无缝对接,提高工作效率。 ... [详细]
  • 通过优化动态网络Cookies的全网互通机制,实现了用户在任意子站点的登录和注销操作均能同步至整个网络。具体实现涉及对三个关键文件的修改:首先,在`incDv_ClsMain.asp`中定位并调整`Response.Cookies`的相关设置;其次,更新`global.asa`以确保会话状态的一致性;最后,修改`login.asp`以支持跨域认证。这一改进不仅提升了用户体验,还增强了系统的安全性和可靠性。 ... [详细]
  • 经过三轮严格的面试,终于顺利加入沪江网。虽然在团队开发方面还有待提升,但充满信心和期待,希望能在这里不断学习和成长。 ... [详细]
  • 本文介绍 DB2 中的基本概念,重点解释事务单元(UOW)和事务的概念。事务单元是指作为单个原子操作执行的一个或多个 SQL 查询。 ... [详细]
  • 优化虎牙直播体验的插件
    近期在观看虎牙直播时,发现广告和一些低质量直播间频繁出现,严重影响了观看体验。为此,我开发了一款插件,帮助用户屏蔽这些不想要的内容。以下是插件的介绍和使用方法。 ... [详细]
  • 春日新芽象征着新的开始,正如学习如同春天的幼苗,虽不易察觉其成长,但每日都在进步;而中断学习则像磨刀石,虽表面无明显损耗,却日积月累地退步。这番话源自古代文人陶渊明的智慧,提醒我们珍惜时光,持续努力,方能迎来更加辉煌的未来。 ... [详细]
author-avatar
爱碩爱你_静莫失心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有