c++关于虚表的一些笔记

文章目录

  • 1、虚函数表指针
  • 2、多态构成的条件
  • 3、重载、重写、重定义 三者区别
  • 4、继承与虚函数
  • 5、单继承中的虚函数表
    • 无虚函数覆盖
    • 有虚函数覆盖
  • 6、单继承中的虚函数表
    • 无虚函数覆盖
    • 有虚函数覆盖
  • 参考

看《深度探索c++对象模型》的时候对虚表有了点疑惑,正好网上有些文章解除了这个疑惑,记录一下

1、虚函数表指针

在64位操作系统下当我们计算包含虚函数的类大小时,我们会发现不管类中有几个虚函数,类的大小都会比没有虚函数时类的大小大8,这是因为存了一个指向虚表的指针,大小为8字节。
对象中的这个指针我们叫做虚函数表指针,虚函数指针指向的这个表叫虚函数表简称虚表,虚表中存的是虚函数的地址

图1 类代码
图2 对象模型

2、多态构成的条件

  • 必须通过父类的指针或者引用调用虚函数
  • 父类的函数必须是虚函数,且子类必须对父类的虚函数进行重写

3、重载、重写、重定义 三者区别

在这里插入图片描述

4、继承与虚函数

在构造子类前会先构造父类,而在构造父类的时候,通过this指针看到如下图左所示,虚函数表中存的父类中的三个虚函数的地址,而在构造子类的时候,可以看到如下图右所示,父类中的虚函数在子类中被重写的两个虚函数将父类的虚函数覆盖了,这就是多态父类指针保存子类地址却可以通过父类指针访问子类成员的原因
在这里插入图片描述
当我们在子类中对父类的虚函数重写后,当父类去调用该虚函数的时候,就会访问虚表,然而虚表中存放的是已经被子类覆盖的子类的函数,所以就会转去调用子类中的重写的虚函数。
在这里插入图片描述
其实子类的虚函数是在虚表中的,只不过从监视器的角度看不到,因为从监视器的角度__vfptr的成员始终属于父类的成员。

5、单继承中的虚函数表

无虚函数覆盖

虚函数按照其声明顺序放于表中;
父类的虚函数在子类的虚函数前面;
在这里插入图片描述

有虚函数覆盖

覆盖的fun1()函数被放到了虚函数表中原来父类虚函数的位置
没被覆盖的函数依旧
在这里插入图片描述

6、单继承中的虚函数表

无虚函数覆盖

每个父类都有自己的虚表
子类的成员函数被放到第一个父类的表中(所谓第一个父类是按照声明顺序来判断的)------>这样做是为了解决不同的父类类型的指针指向同一个子类实例,而能够调用到实际的函数
在这里插入图片描述
子类实例中的虚函数表如下图所示:
在这里插入图片描述

有虚函数覆盖

只要子类中重写的父类的虚函数都会覆盖
没被覆盖的函数依旧
在这里插入图片描述
子类虚函数表如下:
在这里插入图片描述

参考

https://blog.csdn.net/weixin_50886514/article/details/117536971
https://bbs.csdn.net/topics/370154900?page=3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言技巧:把单一元素的数组放在末尾,struct可以拥有可变大小的数组

《C 对象模型》第19页有这样一句话 C程序员的巧计有时候却成为c程序员的陷阱。例如把单一元素的数组放在一个struct的末尾,于是每个struct objects可以拥有可变数组的数组: struct mumble {/* stuff */char pc[1]; };//从文件或标准输入装置中取得一个…

探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别(二)...

看此文,务必需要先了解本文讨论的背景,不多说,给出链接: 探讨C 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别(一) 本文会以此问题作为讨论的实例,来具体讨论以下四个问题&a…

后台系统可扩展性学习笔记(一)概要

文章目录系统大致架构可扩展性负载均衡器与会话保持引入冗余增强系统可用性缓存减轻数据库压力异步处理参考系统大致架构 当一个用户请求从客户端出发,经过网络传输,达到 Web 服务层,接着进入应用层,最后抵达数据层,它…

后台系统可扩展性学习笔记(二)权衡取舍

文章目录性能与可扩展性延迟与吞吐量可用性与一致性一致性模式可用性模式可用性衡量参考系统设计中也面临许多权衡取舍:性能与可扩展性延迟与吞吐量可用性与一致性 性能与可扩展性 可扩展,意味着服务能以加资源的方式成比例地提升性能,性能…

后台系统可扩展性学习笔记(三)DNS机制原理

文章目录DNS概念梳理域名基本概念资源记录基本概念路由策略DNS 域空间结构实现原理复制机制查询机制缓存机制参考DNS概念梳理 DNS(Domain Name System)相当于互联网的通讯录,能够把域名翻译成 IP 地址。 从技术角度来讲,DNS 是个…

后台系统可扩展性学习笔记(四)CDN机制原理

文章目录概念梳理CDN拓扑结构CDN内容分发方式架构原理工作原理实现原理概念梳理 CDN(Content Delivery Network,内容分发网络)是由分布在不同地理位置的代理服务器及其数据中心组成的网络,希望在空间距离上为用户就近提供服务&am…

后台系统可扩展性学习笔记(五)负载均衡

文章目录Load balancer(负载均衡器)请求传输拆解DNS 负载均衡客户端负载均衡OSI 七层模型回顾2 层、3 层负载均衡3/4 层负载均衡7 层负载均衡在 第一节谈到了系统的横向扩展在于从单机扩展到多机,那么面临的第一个问题就是这些机器如何协同工作,即如何调…

Struts2第一个工程helloStruts极其基本配置

前面已经准备好了Struts-2.3.15,现在就可以直接搭建Struts2的工程了。前面http://blog.csdn.net/huangchnegdada/article/details/9179041有对Struts-2.3.15的准备工作的详述。 首先打开MyEclispe新建一个Web Project,名字就叫Struts2_0100_Introduction…

后台系统可扩展性学习笔记(六)反向代理

文章目录Web代理服务反向代理反向代理作用Web代理服务 Web 代理服务指的是在客户端资源请求和提供这些资源的 Web 服务之间充当中介的角色,代理服务可以实现在客户端,或者从客户端到目标服务器中间的任意环节。 例如,客户端不直接向提供目标…

实验:sigsuspend(),sigprocmask()

实验:sigsuspend(),sigprocmask()源代码:/* * Program: pause_suspend.c * To test the difference between sigsuspend() and paus(). * Author: zsl * Date: 2014-10-17 * First release. * 参见网页:http://blog.csdn.net/liwentao1091/ar…

后台系统可扩展性学习笔记(七)Service Discovery与微服务

文章目录应用层微服务架构服务注册查询 Service Discovery客户端 Service DiscoveryDNS-SD DNS-based Service Discovery服务端 Service Discovery服务注册与注销自注册模式第三方注册模式总结参考应用层 在简单的 3 层结构中,Web 服务层既要处理请求,又…

很久没写代码了,这(那)几天真是累死了。。。先写一个幻方的程序吧

1 #include <stdio.h>2 #include <stdlib.h>3 #include <windows.h>4 5 #define EVEN_DOUBLE_4 4 //双偶的最基本类型&#xff0c;4阶双偶6 #define SCREEN_SIZE 19 //屏幕显示不变形的最大尺寸&#xff08;主要是因为窗口大小限制&#xff09;7 #defi…

后台系统可扩展性学习笔记(八)Service Mesh

文章目录网络传输可靠性将微服务控制下沉到网络栈&#xff1f;Sidecar从 Sidecar 到 Service MeshService Mesh 部署平台参考网络传输可靠性 从计网的学习过程中我们可以知道数据在网络传输中可能会出现一些异常状况&#xff1a; 数据丢失&#xff1a;数据包可能会到达一个缓…

关于Spring batch的学习之CSV2DB

最近在学习Spring batch相关的内容&#xff0c;网上也有不少Spring Batch相关的知识&#xff0c;不过大多都是使用xml进行配置的。这里是我用注解的方式进行相关的学习心得。 首先我们来看如何将一个文本文件中的内容导入到数据库中。 我们先来看一下我们所需要的环境。我们这里…

后台系统可扩展性学习笔记(九)Database Replication

文章目录数据库扩展一致性问题Replication &#xff08;复制&#xff09;异步复制同步复制半同步复制拓扑结构单主结构多主结构无主结构复制具体措施参考数据库扩展 之前在第一章后台系统可扩展性学习笔记&#xff08;一&#xff09;概要谈到&#xff1a;理论上&#xff0c;有…

python中的sum函数.sum(axis=1)

看起来挺简单的样子&#xff0c;但是在给sum函数中加入参数。sum&#xff08;a&#xff0c;axis0&#xff09;或者是.sum(axis1) 就有点不解了 在我实验以后发现 我们平时用的sum应该是默认的axis0 就是普通的相加 而当加入axis1以后就是将一个矩阵的每一行向量相加 例如&…

后台系统可扩展性学习笔记(十)Database Partitioning

为了提升数据库的处理能力&#xff0c;我们把单库扩展成多库&#xff0c;并通过更新同步机制&#xff08;即Replication&#xff09;来保证多份数据的一致性。然而&#xff0c;在 各种复制方案下&#xff0c;每个数据库都持有一份完整数据&#xff0c;基于全量数据提供增删改查…

基于FPGA的HDTV视频图像灰度直方图统计算法设计

随着HDTV的普及&#xff0c;以LCD-TV为主的高清数字电视逐渐进入蓬勃发展时期。与传统CRT电视不同的是&#xff0c;这些高清数字电视需要较复杂的视频处理电路来驱动&#xff0c;比如&#xff1a;模数转换&#xff08;A/D Converter&#xff09;、去隔行&#xff08;De-interla…

Java Swing 影楼管理系统之登录功能

开头打广告&#xff0c;Java1234.com。 首先&#xff0c;来个效果图。 关键代码 1&#xff0c;界面层 private void Jb_DengLuActionPerformed(java.awt.event.ActionEvent evt) {// TODO add your handling code here:String UserName this.Jb_UserNameTxt.getText();String …

Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?

【电脑软件管理中Bdsyn手机助手的问题】Bdsyn手机助手 is developed by Baidu, Inc. and is used by 10 users of Software Informer. 并不是本人安装的&#xff08;应该是自己自己主动安装的&#xff09;&#xff0c;卸载以后过几天又会出如今软件列表里。百度搜索却无法搜索出…