c++八股day2-虚函数表和虚函数表指针的创建时机

虚函数表和虚函数表指针的创建时机。

背景:用来实现多态(包括静态多态和动态多态),多态的原理就是虚函数表和虚函数表指针

虚函数表的创建时机:

a.什么时候生成的?编译器编译的时候声生成的,(前提)编译的过程中发现virtual关键字修饰的函数(当然如果有继承且基类有virtual修饰的函数,那也有自己的虚函数表指针)

b.存在哪里?可执行程序(磁盘)、运行状态(内存)

磁盘中:

.bss:未初始化的或初始化为0的全局、静态变量

.data:初始化的静态或全局变量

.rodata:(只读数据段)里面放虚函数表(虚函数地址的数组,其中地址指向text

.text:代码段

运行的时候会加载到内存,那么虚拟内存由哪几部分构成:

内核空间

栈区

文件映射区

堆区

数据区(静态存储区):.bss和.data映射到这里,.bss、.data

代码区:只读数据段(包含虚函数表)和代码段放到这里,.text、.rodata

进程的内存空间:

虚函数表指针在堆区指向虚函数表的地址,函数地址的指针又指向具体代码段的位置,那么虚函数与虚函数表指针的关系:

每个类最多只有一个虚函数表;(类中有virtual关键字修饰的时候才有且最多一个)

一个类的不同的对象(需要考虑浅拷贝和深拷贝),通常虚函数表指针不同,为了让每个对象都有自己的虚函数表指针,尽量使用深拷贝,显示的拷贝构造或重载赋值运算符(浅拷贝会共享一个虚函数表指针,深拷贝使另一个对象也有自己的虚函数表指针);

虚函数表指针就是指向虚函数表的指针

虚函数表的创建时机:

1、类对象构建的时候,把类的虚函数表地址赋值给vptr

2、如果没有构造函数的话,而类中又有虚函数表,那么编译器会生成默认的构造函数

3、继承的情况下(这是要理解多态的原理),虚函数表指针赋值过程:

a.调用基类构造函数,把A的虚函数表的地址赋值给vptr(虚拟函数表指针)

b.调用子类构造函数,把B的虚函数表的地址赋值给vptr(也就是赋值了两次)

class A{

public:

        virtual void func();

};

class B:public class A{

};

多态:A* p=new B();关键点是,指针指向哪个类型的对象

虚函数表是类中有virtual关键字声明的函数,那么这个类在编译的时候就会为它生成虚函数表,存放着虚函数的函数地址,指向代码段中具体的代码位置

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

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

相关文章

第二篇------Virtual I/O Device (VIRTIO) Version 1.1

上篇文章:https://blog.csdn.net/Phoenix_zxk/article/details/132917657 篇幅太大,所以分开写,接下来续上 4.3.3.2.1 设备要求:Guest->Host 通知 设备必须忽略 GPR2 的位 0-31(从左边数)。这样可以使…

高阶数据结构(2)-----红黑树(未完成)

一)红黑树的基本概念和基本性质: 1)红黑树就是一种高度平衡的二叉搜索树,但是在每一个节点上面都增加了一个存储位来表示结点的颜色,可以是红色或者是黑色,通过对任何一条从根节点到叶子节点上面的路径各个节点着色方式的限制,红黑…

做品牌定位,品牌三问是什么?

中小企业起步阶段打造品牌之前,一定要问自己三个问题,分别是: 一、你是什么:解决品类认知的问题; 二、有何不同:解决差异化定位问题; 三、何以见得:解决顾客信任感问题。 这就是…

交叉编译工具链-Ubuntu 安装说明

交叉编译工具链-Ubuntu 安装说明 【实验目的】 了解交叉编译工具链的安装方法与使用方法 【实验环境】 1、 ubuntu 14.04 发行版 【注意事项】 1、实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 1、安装交叉编译工具链 在 ubuntu 下打开一个终端并进入到家…

如何在控制台显示MyBatis的SQL语句

对于application.properties文件,添加以下配置: # 开启 MyBatis SQL日志输出 logging.level.org.mybatisdebug# 输出格式化的 SQL语句 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl# 配置数据库方言 # MySQL方言 mybati…

C语言指针进阶(2)

大家好&#xff0c;我们今天继续来分享指针进阶的内容。 目录 5.函数指针 6.函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 5.函数指针 顾名思义函数指针里面存的就是函数的地址了。 那我们通过一段代码来理解函数指针&#xff1a; #include<stdio.h> int Add…

LeetCode 1584. 连接所有点的最小费用【最小生成树】

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【CVPR2020】DEF:Seeing Through Fog Without Seeing Fog论文阅读分析与总结

Challenge&#xff1a; 之前网络架构的设计假设数据流是一致的&#xff0c;即出现在一个模态中的对象也出现在另一个模态中。然而&#xff0c;在恶劣的天气条件下&#xff0c;如雾、雨、雪或极端照明条件&#xff0c;多模态传感器配置中的信息可能不对称。不同传感器在特征提取…

Ts中的Pick,Omit,Extract和Exclude区别

前言 ts内置的一些常用工具类型&#xff0c;简化ts的操作。它们都是基于泛型实现的&#xff0c;并且内置的&#xff0c;可直接使用。 希望对大家有所帮助同时欢迎讨论并指出问题&#xff01; 1. Pick(选择) 通俗的说法就是&#xff1a;在已经定义的对象中选取一些 pick<T&am…

如何将两个或多个组件嵌入到一个组件中?

将两个或多个组件嵌入到一个组件中是React中的一个常见做法。这通常通过使用React.Children.map函数和React.cloneElement函数来完成。以下是一个示例&#xff0c;说明如何将两个子组件嵌入到父组件中&#xff1a; import React from react;class ParentComponent extends Rea…

MySQL常见的性能优化方法技巧以及示例

MySQL常见的性能优化方法技巧以及示例 MySQL是一种广泛用于管理和存储数据的关系型数据库管理系统。在处理大规模数据和高并发请求时&#xff0c;MySQL的性能优化变得尤为重要。本文将介绍一些常见的MySQL性能优化方法和技巧&#xff0c;以及相应的示例&#xff0c;帮助您提升…

Python 08学习之文件操作

&#x1f600;前言 欢迎来到Python 08学习之文件操作。在本文中&#xff0c;我们将介绍计算机中常见的文本文件和二进制文件&#xff0c;并探讨在Python中操作文件的步骤和相关函数/方法。通过学习本文&#xff0c;您将能够了解如何使用Python打开、读取、写入和关闭文件&#…

pyhton内置的数据类型(二)

pyhton内置的数据类型 一、内置数据类型的解释创建及赋值二、表示转义的符号实例操作 二、字符串的基本特性1.连接操作符 “ ” &#xff0c;提示&#xff1a;必须是同一数据类型才能相加2. 重复操作符 “ * ”3.成员操作符 “ in ”4. 正向索引和反向索引5. 切片&#xff08;…

MySQL与Oracle的分页

MySQL与Oracle的分页 当我们通过SQL去查询一个结果集的时候&#xff0c;并不需要查看所有行&#xff0c;可能只是查看前几行&#xff0c;或者中间的几行。则需要像MySQL的limit或Oracle的ROWNUM与FETCH NEXT来实现。 MySQL 语法 SELECT * FROM table_name LIMIT [offset,] ro…

Redis的介绍,安装Redis的方式

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Redis 初识Redis1.1 认识Redis1.2 安装Redis的方式…

自定义Dynamics 365实施和发布业务解决方案 - 6. Azure集成

在本章中,我们将讨论可用于实现快速和可扩展解决方案的Azure集成。我们将重点关注在Dynamics365实现中有用的三种类型的Azure技术。它们是Azure WebJobs、函数和逻辑应用程序。Azure WebJobs非常适合在后台运行的批处理。由于我们在本章中讨论的是Azure技术,我们还将快速了解…

Hadoop生态圈中的Flume数据日志采集工具

Hadoop生态圈中的Flume数据日志采集工具 一、数据采集的问题二、数据采集一般使用的技术三、扩展&#xff1a;通过爬虫技术采集第三方网站数据四、Flume日志采集工具概述五、Flume采集数据的时候&#xff0c;核心是编写Flume的采集脚本xxx.conf六、Flume案例实操1、采集一个网络…

嵌入式系统设计与应用---嵌入式系统概述(学习笔记)

目录​​​​​​​ 嵌入式系统 概念 组成 嵌入式常用的操作系统 与PC机的区别 开发 软件开发 硬件开发 嵌入式处理器 分类 嵌入式系统 概念 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可载剪&#xff0c;适应对功能、可靠性、成本&#xff0c…

图像处理之频域滤波DFT

摘要&#xff1a;傅里叶变换可以将任何满足相应数学条件的信号转换为不同系数的简单正弦和余弦函数的和。图像信号也是一种信号&#xff0c;只不过是二维离散信号&#xff0c;通过傅里叶变换对图像进行变换可以图像存空域转换为频域进行更多的处理。本文主要简要描述傅里叶变换…

机器学习笔记之最优化理论与方法(十)无约束优化问题——共轭梯度法背景介绍

机器学习笔记之最优化理论与方法——共轭梯度法背景介绍 引言背景&#xff1a;共轭梯度法线性共轭梯度法共轭方向共轭VS正交共轭方向法共轭方向法的几何解释 引言 本节将介绍共轭梯度法&#xff0c;并重点介绍共轭方向法的逻辑与几何意义。 背景&#xff1a;共轭梯度法 关于…