当前位置: 首页 > news >正文

多态/虚函数/虚函数表

OVERVIEW

  • 多态/虚函数/虚函数表
      • 1.虚函数引入后类发生的变化?
      • 2.虚函数表的生成时机和生成原因?
      • 3.虚函数表指针赋值的时机?
      • 4.类对象在内存中的布局?
      • 5.虚函数的工作原理和多态性的体现?
      • 6.其他问题

多态/虚函数/虚函数表


  • non-virtual:不希望derived class 重新定义该它
  • virtual:希望derived class重新定义它,并且你对它已经有了默认的定义
  • pure-virtual:希望derived class一定要重新定义它

1.虚函数引入后类发生的变化?

class A {
public:void func1() {}void func2() {}
public:virtual void vfunc() {}
};
sizeof(A) = 4;//x86
sizeof(A) = 8;//linuxgcc

当一个或者多个虚函数加入到类中之后,编译器会向类中插入一个看不见的成员变量void *vptr虚函数表指针(virtual table ptr),

2.虚函数表的生成时机和生成原因?

当某个类中存在至少一个虚函数的时候,在编译期间编译器就会为类A生成一个虚函数表 vtbl(virtual table),

虚函数表会一直伴随着类经过编译、链接、生成可执行文件、装载到内存中来,

3.虚函数表指针赋值的时机?

在这里插入图片描述

对于有虚函数的类在编译期时编译器向类的构造函数中安插为vptr赋值的语句,在创建类对象时使得vptr指向类的vtbl,

4.类对象在内存中的布局?

class A {
public:void func1() {}void func2() {};
public:virtual void vfunc1() {}virtual void vfunc2() {}virtual ~A() {}
private:int m_a;int m_b;
};
sizeof(A) = 12;

在这里插入图片描述

类A在内存中的布局:

5.虚函数的工作原理和多态性的体现?

多态性:多态必须存在虚函数,没有虚函数绝不可能存在多态,并且只有调用虚函数时才有存在多态性的可能,

在这里插入图片描述

从代码上看多态的体现

  1. 父类中有虚函数、子类中也有该同名的虚函数,
  2. 当通过父类指针new子类对象 or 通过父类引用绑定子类对象时,
  3. 如果用父类指针来调用该虚函数,那么调用的是子类的虚函数,
class Base {
public:virtual void myvirfunc() {}
};Base *ptr = new Base();
ptr->myvirfunc();//多态
Base base;
base.myvirfunc();//非多态
Base *pbase = &base;
pbase->myvirfunc();//多态

从表现形式上看多态的体现

  1. 程序中既存在父类也存在子类,父类中必须含有虚函数,子类中也必须重写父类中的虚函数,
  2. 父类指针指向子类对象,或者父类引用绑定/指向子类对象,
  3. 当通过父类的指针or引用,调用子类中重写的虚函数时,就能看出多态性的表现了(调用的是子类的虚函数),
class Derive : public Base {
public:virtual void myvirfunc();
};
//父类指针指向子类对象1
Derive derive;
Base *pbase1 = &derive;
pbase1->myvirfunc();
//父类指针指向子类对象2
Base *pbase2 = new Derive();
pbase2->myvirfunc();
//父类引用绑定子类对象
Derive derive2;
Base &refer_base = derive2;
refer_base.myvirfunc();

在这里插入图片描述

6.其他问题

  • 问:当进行多重继承时,子类对象有几个虚函数表指针?子类有几个虚函数表?
  • 答:在进行多重继承时,子类对象会包含每个父类的成员变量和虚函数表指针。

如果每个父类都有虚函数,那么每个父类都会有一个虚函数表,子类对象会包含每个父类的虚函数表指针,因此子类对象会有多个虚函数表指针,每个指针指向相应的虚函数表。

如果某个父类没有虚函数,那么子类对象就不会包含该父类的虚函数表指针,只会包含其他父类的虚函数表指针和成员变量。

  • 问:如果将虚继承(虚基类)融入进来,这时又多出来了虚基类表指针和虚基类表,那么虚基类表指针在对象内存中的布局?
  • 浅谈C++类中的内存布局:https://www.zhihu.com/tardis/zm/art/380147337?source_id=1005

相关文章:

多态/虚函数/虚函数表

OVERVIEW 多态/虚函数/虚函数表1.虚函数引入后类发生的变化?2.虚函数表的生成时机和生成原因?3.虚函数表指针赋值的时机?4.类对象在内存中的布局?5.虚函数的工作原理和多态性的体现?6.其他问题 多态/虚函数/虚函数表 n…...

QT中按钮的基类QAbstractButton

QT中按钮的基类QAbstractButton 关于控件类的学习方法继承关系信号槽函数标题和图标按钮的 Check 属性 关于控件类的学习方法 控件类很多,API更多,但是不需要记忆知道控件对应的类名,通过帮助文档随用随查优先看帮助文档中控件对应的信号和槽…...

并查集(种类并查集,带权并查集)

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都…...

飞天使-k8s基础组件分析-控制器

文章目录 控制器含义解释pod的标签与注释ReplicaControllerReplicaSetDeploymentsDaemonSetJobCronjob参考文档 控制器含义解释 空调遥控器知道吧ReplicationController: ReplicationController确保在任何时候都运行指定数量的pod副本。换句话说,一个ReplicationCo…...

有序充电运营管理平台是基于物联网和大数据技术的充电设施管理系统-安科瑞黄安南

随着我国能源战略发展以及低碳行动的实施,电动汽车已逐步广泛应用,而电动汽车的应用非常符合当今社会对环保意识的要求,以及有效节省化石燃料的消耗。 由于其没有污染排放的优点以及政府部门的关注,电动汽车将成为以后出行的重要…...

LeetCode-227-基本计算器Ⅱ

题目描述: 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意:不允许使用任何将字符串作为数学表达式计…...

dart 学习列表 List

List 列表 在 Dart 编程语言中,List 是一种有序的集合数据类型,用于存储一系列项目。它允许您在单个变量中存储多个项目,并提供了许多操作来管理列表中的数据。以下是关于 Dart 中的 List 的一些重要信息: 创建 List: …...

数据结构--树4.2.1(二叉树)

目录 一、二叉树的存储结构 二、二叉树的遍历 一、二叉树的存储结构 顺序存储结构:二叉树的顺序存储结构就是用一维数组存储二叉树中的各个结点,并且结点的存储位置能体现结点之间的逻辑关系。 链式存储结构:二叉树每个结点最多只有两个孩…...

Presto之Driver个数

一. 前言 在Presto的Stage Performace中,每个Operator中都会有Driver个数的显示,如下图所示。本文主要介绍Presto中是如何决定Driver的个数的。 二. Driver个数 在Presto中,一个pipeline中启动多少个Driver,是由此Pipeline处理的S…...

R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化

全文链接:https://tecdat.cn/?p33499 响应面(Response Surface Methodology,RSM)分析是一种常用的统计方法,用于研究和优化生产过程中的影响因素。通过建立数学模型来描述因素与响应之间的关系,RSM可以帮助…...

剑指Offer --- 字符串篇

剑指Offer — 字符串篇 — 剑指的题解K神已经写的已经非常详细了,并且Github上开源的电子书目前热度也非常高,这个12天12个模块系列就当作自己的秋招刷题汇总了,欢迎大家交流。 剑指 Offer 05. 替换空格 思路 **(线性扫描) ** O(n) 这个…...

7.elasticsearch同步工具-logstah

1.logstah Logstash 是一个用于数据处理和转换的开源工具,它可以将来自不同源头的数据收集、转换、过滤,并将其发送到不同的目标。Logstash 是 ELK(Elasticsearch、Logstash 和 Kibana)技术栈的一部分,通常与 Elastics…...

Redis之stream类型解读

目录 基本介绍 数据结构 消息 消费组 消费者 基本使用命令 概述 xadd 命令 xtrim 命令 xdel 命令 xlen 命令 xrange 命令 xread 命令 xgroup 命令 xreadgroup 命令 xack 命令 基本介绍 Redis stream(流)是一种数据结构,其…...

C++ 网络编程项目fastDFS分布式文件系统(九)总结

1. Location语法 1. 语法规则 location [ |~|~ * |^~ ] /uri/ { … } 正则表达式中的特殊字符 : - . () {} [] * ? 2. Location 优先级说明 在 nginx 的 location 和配置中 location 的顺序没有太大关系。 与 location 表达式的类型有关。 相同类型的表达式&a…...

第五章 树与二叉树 一、树的定义与考点

一、定义 1.树是由n (n > 0) 个节点组成的有限集合。 2.当n0时,称为空树。 3.在非空树中,有且仅有一个节点没有前驱,其他节点都有且仅有一个前驱,称为根节点。 4.每个节点有零个或多个子节点,而每个子节点又有零…...

C语言基础之——指针(下)

前言:本篇文章将继续讲解有关指针的剩余基础知识。 学无止境,一起加油叭!! 目录 一.指针运算 1.指针 - 整数 2.指针的关系运算 3.指针 - 指针 二.指针与数组 三.二级指针 四.指针数组 总结 一.指针运算 指针运算包括以下三…...

小研究 - JVM 的类装载机制

本文通过对一个类装载实例的分析,阐明了 Java虚拟机的类装载的代理机制和由此定义的命名空间,指出了类装载机制在容器/组件/抽象框架结构中的作用。 目录 1 引言 2 实例 3 分析 3.1 类装载的代理机制 3.2 Java的命名空间 3.3 解决问题 4 应…...

项目---日志系统

目录 项目系统开发环境核心技术日志系统介绍为什么需要日志系统? 日志系统框架设计日志系统模块划分代码实现通用工具实现日志等级模块实现日志消息模块实现格式化模块实现落地模块实现日志器模块同步日志器异步日志器缓冲区实现异步工作器实现 回归异步日志器模块建造者模式日…...

设计模式--建造者模式(Builder Pattern)

一、什么是建造者模式 建造者模式(Builder Pattern)是一种创建型设计模式,它关注如何按照一定的步骤和规则创建复杂对象。建造者模式的主要目的是将一个复杂对象的构建过程与其表示分离,从而使同样的构建过程可以创建不同的表示。…...

若依vue打印的简单方法

像我们后端程序员做前端的话,有时候真不需要知道什么原理,直接塞就好了 我们选用基于hiprint 的vue-plugin-hiprint来打印 目的是为了实现点击某些行的数据,然后点击某个按钮直接弹出下面的打印 此链接 大佬是原创,我拿来总结梳理一下 插件进阶功能请移步: 链接 插件模板制作页…...

Rust 基础语法学习

Rust 基础语法学习 文章目录 Rust 基础语法学习hello world变量数据类型整数类型进制表示方法浮点数类型布尔类型字符类型字符串复合类型元组结构体元组结构体 切片类型字符串切片数组切片 不可变变量与可变变量常量注释函数语句与表达式 流程控制语句if else条件判断while循环…...

iOS开发Swift-函数

1.函数的定义和调用 func greet(person: String) -> String { // 函数名 传入值 传入值类型 返回值类型let greeting "Hello" personreturn greeting } print( greet(person: "Anna") ) //调用2.函数的参数与返回值 (1)无参函数 func sayHe…...

序列化协议:JSON和XML

作者:CARROT 链接:https://www.zhihu.com/question/604811576/answer/3100483698 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 json和xml都是数据传输的格式。比如我们开发过程中需要和网…...

江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电

长期以来,石油天然气、石油石化、发电和管道输送行业在环保、健康和安全保障方面一直承受着巨大的压力,他们必须确保相关规程在各项作业中得到全面贯彻。 阀门作为流体管道运输中的组成部分,其装配密封度是保证流体运输安全的重要一环&#…...

Go【gin和gorm框架】实现紧急事件登记的接口

简单来说,就是接受前端微信小程序发来的数据保存到数据库,这是我写的第二个接口,相比前一个要稍微简单一些,而且因为前端页面也是我写的,参数类型自然是无缝对接_ 前端页面大概长这个样子 先用apifox模拟发送请求测试…...

第一个VUE程序?

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head> <body><div id"app">{{message}} </div><!-- 1.导入Vue.js --> <script s…...

电阻器件的分类

电阻器的种类碳膜电阻膜式电阻器中的一种。气态碳氢化合物在高温和真空中分解&#xff0c;碳沉积在瓷棒或者瓷管上&#xff0c;形成一层结晶碳膜。改变碳膜厚度和用刻槽的方式变更碳膜的长度可以得到不同的阻值。碳膜电阻成本较低&#xff0c;电性能和稳定性较差&#xff0c;一…...

QT基础教程之二 第一个Qt小程序

QT基础教程之二 第一个Qt小程序 按钮的创建 在Qt程序中&#xff0c;最常用的控件之一就是按钮了&#xff0c;首先我们来看下如何创建一个按钮 QPushButton * btn new QPushButton; 头文件 #include <QPushButton>//设置父亲btn->setParent(this);//设置文字btn-&g…...

Edge用户数据目录查找

创建 Microsoft Edge 用户数据目录变量...

最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码|霸王餐美团/饿了么系统/外卖红包cps粉丝裂变玩法源码下载

最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码、霸王餐美团、饿了么系统&#xff0c;粉丝裂变玩源码下载&#xff0c;外卖cps小程序项目&#xff0c;外卖红包cps带好友返利佣金分销系统程序、饿了么美团联盟源码&#xff0c;外卖cps带分销返利后端源码&#xff0c;基于L…...

html好看的个人主页/seo排名优化教程

项目场景&#xff1a; 在使用SDL库时&#xff0c;需要引入SDL2/SLDL.h头文件&#xff0c;但是引入之后会报错 原因分析&#xff1a; 可以看到在SDL库中&#xff0c;main函数被重定义了&#xff0c;因此VS找不到入口函数。。。&#xff1a; 解决方案&#xff1a; 在引用SDL2/S…...

合肥做网站优化/做推广app赚钱的项目

有时因为病毒修改或人为删除了某个系统文件,造成系统无法正常运行的时候, 如果知道被修改或丢失的文件的文件名,我们就可以试着用光盘来修复,但是修复的时间很长,我们可以直接用expand命令来提取所需要的那个文件. 其用法如下: EXPAND [-r] Source DestinationEXPAND -r Source…...

门户网站建站方案/抖音seo搜索优化

模型实例方法 str()&#xff1a;在将对象转换成字符串时会被调用。save()&#xff1a;将模型对象保存到数据表中&#xff0c;ORM框架会转换成对应的insert或update语句。delete()&#xff1a;将模型对象从数据表中删除&#xff0c;ORM框架会转换成对应的delete语句。模型类的属…...

网站功能测试内容/如何做好关键词的优化

修改hosts 先到https://www.ipaddress.com/上查询github.com和github.global.ssl.fastly.net最快的ip&#xff0c;然后在etc/hosts文件下新增&#xff1a; 140.82.113.3 github.com 151.101.185.194 github.global.ssl.fastly.net注意上面的151.101.185.194是我查询github.gl…...

网站建设书模板/竞价托管推广公司

高校志愿者信息管理系统&#xff0c;其功能目标是实现将现有的高校志愿者信息管理系统模式向基于Internet的无纸张化志愿者信息管理模式的转变&#xff0c;所以它必须实现本身社团信息的管理&#xff0c;对参与志愿者社团活动的学生的管理。通过互联网联络协会成员的关键是要建…...

织梦网站怎么做下载地址/企业培训考试

来上海的这段日子里偶的博客有很长一段时间没有更新了&#xff0c;人流量下降了不少哈&#xff01;为了弥补自己的过失&#xff0c;打算最近开博啦&#xff0c;不过说句实话还真不知道该写些什么哈&#xff01;既然不知道该写什么&#xff0c;那就说说来上海的这段日子的感受吧…...