多态原理探究

2023-11-15

概念

  1. 当类中声明虚函数时,编译器会在类中生成一个虚函数表
  2. 虚函数表是一个存储类成员函数指针的数据结构
  3. 虚函数表是由编译器自动生成与维护的
  4. virtual成员函数会被编译器放入虚函数表中
  5. 当存在虚函数时,每个对象中都有一个指向虚函数表的指针(C++编译器给父类对象、子类对象提前布局vptr指针;当进行howToPrint(Parent *base)函数是,C++编译器不需要区分子类对象或者父类对象,只需要再base指针中,找vptr指针即可。)
  6. VPTR一般作为类对象的第一个成员

实现原理

  • C++中多态的实现原理
  • 当类中声明虚函数时,编译器会在类中生成一个虚函数表
  • 虚函数表是一个存储类成员函数指针的数据结构
  • 虚函数表是由编译器自动生成与维护的
  • virtual成员函数会被编译器放入虚函数表中
  • 存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)

  • 通过虚函数表指针vptr调用函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正调用的函数,普通成员函数在编译时就确定调用的函数,所以效率上虚函数要比普通函数的开销大很多
  • 同样的,虚函数的开销又要比平常的大,因为在声明了virtual会有一个指针的开销
  • C++编译器,执行HowToPrint函数,不需要区分是子类对象还是父类对象
构造函数中能调用虚函数,实现多态吗

首先说结论,不能,这其实是vptr指针的初始化问题
整体来说:只有在对象构造完全结束,后vptr指针才最终的指向确定
父类的vptr指针会指向父类虚构函数表
子类的vptr指针会指向子类虚构函数表
如果细分的话
他其实是分步的,当创建一个子类对象的时候,vptr指针会先指向父类的虚构函数表,在父类完成构造后,会才会指向子类的虚构函数表在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多态原理探究 的相关文章

随机推荐

  • 近年来,学习图像去雾不得不看的论文和源代码

    S G Narasimhan and S K Nayar 多幅图像 同一场景不同时间 天气 去雾 主页 NASA Retinex理论增强 主页 Ana Bel n Petro总结了NASA的Retinex理论 源代码 不过不是matlab版
  • HDU--1050:Moving Tables (贪心)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1050 2 解题思路 将每个输入的起始房间和结束房间转换为房间前面的区间 按区间起始位置从小到大排序 首先取第一个区间 后续如果有区间的起始位
  • 计算机网络-第一章 计算机网络体系结构(详细知识点总结)

    目录 第一章 计算机网络体系结构 大纲 1 1 计算机网络概述 1 1 1 计算机网络的概念 1 1 2 计算机网络的组成 1 1 3 计算机网络的功能 1 1 4 计算机网络的分类 1 1 5 计算机网路的标准化工作及相关组织 1 1 6
  • 编译mediastreamer2/ffmpeg/linphone(x86平台)

    在x86环境下编译mediastreamer2的步骤 1 编译OGG库 音频编解码 http www xiph org downloads configure prefix usr disable static 2 编译SPEEX 音频编解
  • java对象比较器_具有多个字段的对象的Java比较器

    我有Collection5个字段的对象 id entityType entityId brandId productId 要排序的ArrayList的Collection我写了下面Comparaor Comparator collectio
  • uint是什么数据类型_「IEC 61131-3」标准数据类型

    IEC 61131 3定义的标准数据类型有 布尔型 整型 浮点型 字符串型 时间日期类型和常数 以下将逐一介绍各种数据类型 布尔型 布尔变量可取值TRUE和FALSE 占8位内存空间 布尔型变量声明示例 bExec BOOL FALSE b
  • 无法启动此程序,因为计算机中丢失QT5Core.dll

    背景 QT项目从QTCreator移植到VS2010中时出现这个问题 原因 在Qt Creator中运行时会根据你当前选择的构建套件生成一套自己的环境变量 这套环境变量与当前电脑的环境变量的差别是添加了Qt库的引用路径 所以在Creator
  • 取余运算的规则

    取余运算满足以下规则 x y p x p y p p 证明如下 假设 x a p b y c p d 则 x p b y p d 则 x y p a p b c p d p a c p b d p b d p x p y p p
  • JAVASE总复习

    一 填空题 共 20 个题目 总计 20 分 1 Java application 中的主类需要包含 main 方法 main 方法的返回类型是void 2 移位运算符可以起到对操作数乘以 2 或者除以 2 的作用 那么操作数除以 2 的移
  • shader练习中遇到的问题点

    half3 lrDirWS normalize reflect lDirWS nDirWS 不加normalize会有白点点 1 max 0 ndotv 模型上会出现黑点点 max 0 1 ndotv 模型上不会出现黑点点
  • Spirng的事务 方法A调用方法B,事务是否失效

    Springboot开启了事务的方法调用没有事务的方法 提示 上方标题是一个很笼统的场景 详情展开如下 先说结论 总结 方法A调用方法B 场景一 如果A和B方法在同一个类中 如果A加 Transactional注解 B加不加 Transac
  • 看完这篇 教你玩转渗透测试靶机vulnhub——FunBox1

    Vulnhub靶机FunBox1渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 暴力破解 ssh登入 提权 获取flag Vulnhub靶机渗透总结 Vulnhub
  • Golang CLI框架介绍

    网址 https github com mitchellh cli 功能 该框架是个人开发的命令行程序框架 作者还成立了公司 HashiCorp 其公司的产品也采用这个CLI框架 解读 框架的思路是 把命令和执行方法以map的形式记录在内部
  • 命令查看被占用端口号,并杀死进程

    1 win R 输入cmd回车打开命令窗口 2 查看所有端口 命令 netstat an 3 查看单个端口号是否被占用 netstat ano findstr 8080 最后一列是占用端口对应的进程号 4 查看进程号对应的进程名称 task
  • 关于对比损失(contrasive loss)的理解(相似度越大越相似的情况):

    def contro loss self 总结下来对比损失的特点 首先看标签 然后标签为1是正对 负对部分损失为0 最小化总损失就是最小化类内损失 within loss 部分 让s逼近margin的过程 是个增大的过程 标签为0是负对 正
  • gitee的一些常用命令

    Gitee 是一个基于 Git 的代码托管和协作平台 提供了一些常用的命令来完成代码的管理和协作 以下是一些常见的 Gitee 命令 克隆远程仓库到本地 Copy Codegit clone lt 远程仓库地址 gt 将本地代码提交到远程仓
  • Matlab

    目录 摘要 一 电力负荷数据导入 二 输入输出数据归一化 三 建立和训练BP神经网络 四 使用测试数据进行负荷预测 五 Matlab代码实现 摘要 使用BP神经网络实现简单的电力负荷回归预测任务 主要的步骤为 导入数据 数据归一化 建立BP
  • Linux中级实战专题篇三:nginx服务(日志介绍,作用域,格式定义,流量控制,访问控制模块,用户信任登录)

    Nginx 日志配置 1 Nginx 日志介绍 Nginx 有一个非常灵活的日志记录模式 每个级别的配置可以有各自独立的访问日志 所需日志模块 ngx http log module 的支持 日志格式通过 log format 命令来定义
  • NP完全问题的证明-算法概论课后习题8.15

    题目 证明如下问题是NP 完全的 输入 两个图G1 V1 E1 和G2 V2 E2 预算b 输出 两个节点集合V1 V1 和V2 V2和它们被移除后 将在两图中分别留下至少b个节点 且图的剩余部分完全一样 解析 可将最大独立集问题归约到此问
  • 多态原理探究

    概念 当类中声明虚函数时 编译器会在类中生成一个虚函数表 虚函数表是一个存储类成员函数指针的数据结构 虚函数表是由编译器自动生成与维护的 virtual成员函数会被编译器放入虚函数表中 当存在虚函数时 每个对象中都有一个指向虚函数表的指针