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,一经查实,立即删除!

相关文章

4、在Shell程序中的使用变量

学习目标变量的赋值变量的访问变量的输入 12-4-1 变量的赋值在Shell编程中,所有的变量名都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,其格式如下:变量名值。注意:等号()前后没有空格例如: …

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

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

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

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

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

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

poj 3728(LCA + dp)

题目链接:http://poj.org/problem?id3728 思路:题目的意思是求树上a -> b的路径上的最大收益(在最小值买入,在最大值卖出)。 我们假设路径a - > b 之间的LCA(a, b) f, 并且另up[a]表示a - > f之间的最大收益…

成功之路

1、每天都要有进步,都要有新知识的收获。 2、工作认真负责,高效的完成,多总结。 3、自己多练习一些感兴趣的东西,实践!!! 4、写博客。 5、百度、腾讯、阿里是目标,差距还很大&#x…

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

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

iOS中使用子线程的完整方法

第一步:开启子线程 //开启子线程到网络上获取数据myFirstThread [[NSThread alloc]initWithTarget:self selector:selector(thread1GetData) object:nil];[myFirstThread setName:"第一个子线程,用于获取网络数据"];[myFirstThread start]; 第二步&…

DIV的表单布局

表单布局其实用表格最好了&#xff0c;可是表格的话&#xff0c;无法定位&#xff0c;这个是一个硬伤。 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>表单布局</title> <link rel"stylesheet" …

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

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

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

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

Javascript 基础—变量 运算符

经过找工作笔试的洗礼&#xff0c;感觉自己js语法方面掌握的不是很系统&#xff0c;今天来梳理下——变量以及运算符。 基础篇 和C语言的不同点&#xff1a;是一种弱类型语言&#xff0c;申明变量时不需要指定类型&#xff1b;变量名的命名方法也有不同&#xff1b;简单类型种类…

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

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

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

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

[LeetCode]Find Minimum in Rotated Sorted Array

题目描述&#xff1a; Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 解题方案&#xff1a; 直接贴代码&…

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

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

(C)单链表

老师版 1 #include <stdio.h>2 #include <stdlib.h>3 4 // 定于Node数据类型5 struct Node6 {7 int data; // 数据域8 struct Node *next; // 指针域9 };10 11 // 创建一个单链表&#xff0c;并把head节点返回&#xff1b;…

实验:sigsuspend(),sigprocmask()

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

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

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