多态/虚函数/虚函数表

news2024/11/22 16:04:21

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

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

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

相关文章

Android JNI系列详解之生成指定CPU的库文件

一、前提 这次主要了解Android的cpu架构类型,以及在使用CMake工具的时候,如何指定生成哪种类型的库文件。 如上图所示,是我们之前使用CMake工具默认生成的四种cpu架构的动态库文件:arm64-v8a、armeabi-v7a、x86、x86_64&#xff0…

昇腾Ascend+C编程入门教程(纯干货)

2023年5月6日,在昇腾AI开发者峰会上,华为正式发布了面向算子开发场景的昇腾Ascend C编程语言。Ascend C原生支持C/C编程规范,通过多层接口抽象、并行编程范式、孪生调试等技术,极大提高了算子的开发效率,帮助AI开发者低…

go学习之流程控制语句

文章目录 流程控制语句1.顺序控制2.分支控制2.1单分支2.2双分支单分支和双分支的四个题目switch分支结构 3.循环控制for循环控制while 和do...while的实现 4.跳转控制语句breakcontinuegotoreturngotoreturn 流程控制语句 介绍:在程序中,程序运行的流程…

星际争霸之小霸王之小蜜蜂(七)--消失的子弹

目录 前言 一、删除子弹 二、限制子弹数量 三、继续重构代码 总结 前言 昨天我们已经让子弹飞了起来,但是会面临一个和之前小蜜蜂一样的问题,小蜜蜂的行动应该限制在窗口内,那么子弹也是有相同之处,也需要限制一个移动范围&…

智慧监狱整体解决方案PPT

导读:原文《智慧监狱整体解决方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发本文,了解更多…

全球互联网裁员下测试人员何去何从?

时间好像突然加快了步伐瞬间觉得匆匆,转眼已经23年,从20年到23年。回想起来恍恍惚惚,疫情中经历的种种就好像没有发生过一样,很多的魑魅魍魉荒唐可笑真实又虚幻,时光向前人生向后,那些魔幻的人和事也慢慢消…

可解释性的相关介绍

一、可解释性的元定义(Meta-definitions of Interpretability) The extent to which an individual can comprehend the cause of a model’s outcome. [1]The degree to which a human can consistently predict a model’s outcome. [2] 可解释性&am…

Flutter 项目结构文件

1、Flutter项目的文件结构 先helloworld项目,看看它都包含哪些组成部分。首先,来看一下项目的文件结构,如下图所示。 2、介绍上图的内容。 -litb/main.dart文件:整个应用的入口文件,其中的main函数是整个Flutter应…

Fei-Fei Li-Lecture 16:3D Vision 【斯坦福大学李飞飞CV课程第16讲:3D Vision】

目录 P1 2D Detection and Segmentation​编辑 P2 Video 2D time series P3 Focus on Two Problems P4 Many more topics in 3D Vision P5-10 Multi-View CNN P11 Experiments – Classification & Retrieval P12 3D Shape Representations P13--17 3D Shape Rep…

【集合学习ConcurrentHashMap】ConcurrentHashMap集合学习

ConcurrentHashMap集合学习 一、JDK1.7 和 1.8 版本ConcurrenHashMap对比分析 JDK 1.7版本 在JDK 1.7版本ConcurrentHashMap使用了分段锁的方式(对Segment进行加锁),其实际结构为:Segment数组 HashEntry数组 链表。由很多个 …

蓝蓝设计ui设计公司作品案例-中节能现金流抗压测试软件交互及界面设计

中国节能是以节能环保为主业的中央企业。中国节能以生态文明建设为己任,长期致力于让天更蓝、山更绿、水更清,让生活更美好。经过多年发展,中国节能已构建起以节能、环保、清洁能源、健康和节能环保综合服务为主业的41产业格局,成…

计算机组成原理 | 第一章 计算机系统概述

目录 计算机发展历程 计算机系统层次结构 计算机的性能指标 计算机发展历程 电子计算机的发展已经历了4代,这4代计算机的主要元件分别是电子管、晶体管、中小规模集成电路、大规模集成电路。微型计算机的发展以微处理器技术为标志。可以在计算机中直接执行的语…

【Docker系列】Docker-核心概念/常用命令与项目部署实践

写在前面 Docker是一种开源的容器化技术,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,从而实现快速部署和高效运行。Docker的核心概念包括镜像、容器、仓库等。本文将详细介绍Docker的基本概念、安装方法以及常用命令。 一、Doc…

第 360 场 LeetCode 周赛题解

A 距离原点最远的点 串中的 “_” 处要么都向左走要么都向右走 class Solution { public:int furthestDistanceFromOrigin(string moves) {int t 0;for (auto x: moves)if (x ! R)t--;elset;int res abs(t);t 0;for (auto x: moves)if (x ! L)t;elset--;res max(res, abs(t…

土豆叶病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,视频识别)

效果视频:土豆叶病害识别(Python代码,pyTorch框架,视频识别)_哔哩哔哩_bilibili 代码运行要求:Torch库>1.13.1,其它库无版本要求 1..土豆叶数据集主要包好三种类别(Early_Bligh…

集丰照明|汽车美容店设计,装修色彩灯光搭配方法

正确处理好店面的空间设计。 店铺各个功能区设计要合理,衔接合理,这样既能提高员工的工作效率也能提高顾客的满意度。合理安排店铺的空间分配, 要给顾客一种舒适度,既不能让顾客感觉到过于拥挤,又不能浪费店铺的有限空…

邂逅JavaScript

前言:前端三大核心 前端开发最主要需要掌握的是三个知识点:HTML、CSS、JavaScript 一、认识编程语言 1.计算机语言 前面我们已经学习了HTML和CSS很多相关的知识: 在之前我们提到过, HTML是一种标记语言, CSS也是一种样式语言; 他们本身都是属于计算…

Android JNI系列详解之ndk编译工具环境变量配置

一、前提 之前是只介绍了CMake编译工具的使用,现在介绍另一种原生(NDK自带的脚本工具)自带的编译方式:ndk-build,想要使用ndk-build编译工程,我们需要配置全局的环境变量。 二、配置环境变量 找到ndk在电脑…

HRS--人力资源系统(Springboot+vue)--打基础升级--(六)分页查询 + 重置按钮

一:先弄个简单的重置按钮 1.界面设计就放在搜索框同一列的位置 2. 在点击重置按钮时,清空搜索框内的内容,同时触发一次无条件查询(这个写法有bug,下面会有说明) 二:做分页 在MyBatis中,有多种方法可以实现分…