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


推荐阅读
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了如何使用ActionScript 3.0 (AS3) 连接并操作MySQL数据库。通过具体的代码示例和步骤说明,帮助开发者理解并实现这一过程。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 本文详细介绍了美国最具影响力的十大财团,包括洛克菲勒、摩根、花旗银行等。这些财团在历史发展过程中逐渐形成,并对美国的经济、政治和社会产生深远影响。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 在现代Web应用中,当用户滚动到页面底部时,自动加载更多内容的功能变得越来越普遍。这种无刷新加载技术不仅提升了用户体验,还优化了页面性能。本文将探讨如何实现这一功能,并介绍一些实际应用案例。 ... [详细]
  • 本文介绍如何在华为CE交换机上配置M-LAG(多链路聚合组),以实现CE1和CE2设备作为VLAN 10网关的高可用性。通过详细的配置步骤,确保网络冗余和稳定性。 ... [详细]
  • 解决SVN图标显示异常问题的综合指南
    本文详细探讨了SVN图标无法正常显示的问题,并提供了多种有效的解决方案,涵盖不同环境下的具体操作步骤。通过本文,您将了解如何排查和修复这些常见的SVN图标显示故障。 ... [详细]
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社区 版权所有