热门标签 | 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基类的虚函数表中,不会增加虚函数表指针个数。


推荐阅读
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 本文详细介绍了流编辑器sed中的G、H、g、h命令,探讨了它们的工作原理及应用场景。通过实例解析和图解分析,帮助读者掌握这些高级命令的使用方法。 ... [详细]
  • 本文探讨了如何在 F# Interactive (FSI) 中通过 AddPrinter 和 AddPrintTransformer 方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。 ... [详细]
  • ArcXML:互联网空间数据交换的专用语言
    ArcXML是一种专为ArcIMS平台设计的数据交换协议,基于XML标准,用于在不同组件之间传输和描述地理空间数据。本文将详细介绍ArcXML的背景、用途及其与XML的关系。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 深入解析8086 CPU的转移指令
    本文详细介绍了8086 CPU中的转移指令,包括无条件转移、条件转移、循环指令及过程调用等,同时探讨了offset操作符的功能及其应用实例。 ... [详细]
  • 本文详细介绍如何在 Windows 环境下安装 Ubuntu 12.04 版本的 Linux 操作系统,包括必要的软件下载、配置步骤以及注意事项。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 在漫长的人生旅程中,谁能声称自己一路顺遂,毫无波折?谁又能断言未来不会遭遇挫折与挑战?成功并非一蹴而就,它背后往往隐藏着无数的艰辛与磨难。本文探讨了如何面对挫折、坚持不懈,最终实现梦想。 ... [详细]
  • 本文提供了 CIW Dreamweaver MX2004 认证考试的详细试题解析,涵盖不同难度级别的选择题、多项选择题和判断题。通过这些题目,考生可以更好地理解考试内容并为实际考试做好准备。 ... [详细]
  • Shell脚本中变量操作详解
    本文基于《鸟哥的Linux私房菜》一书,详细介绍了Shell脚本中变量的使用方法,包括变量的赋值规则、字符串处理技巧以及环境变量的管理等,旨在帮助读者更好地理解和使用Shell中的变量。 ... [详细]
  • 本文探讨了在多种编程语言中实现Hello World输出的方法,从经典的C语言到现代的JavaScript,每种语言都有其独特的表达方式。 ... [详细]
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社区 版权所有