c++之旅第八弹——多态

大家好啊,这里是c++之旅第八弹,跟随我的步伐来开始这一篇的学习吧!

如果有知识性错误,欢迎各位指正!!一起加油!!

创作不易,希望大家多多支持哦!

一,动态联编和静态联编:

1.什么是联编:

是计算机自身彼此关联的过程,在这个过程中确定程序中的操作调用与之前操作的代码段之间的映射关系

比如:函数重载时,编译器会根据函数名和函数的参数来区别要执行的函数 ( 哪一段代码 ) 。这就是建立的一种映射关系,明确函数调用时会执行哪一个代码段。

2.静态和动态的理解(用数组初始化操作来理解):

数组的静态初始化是在数组一产生就给它赋值,即定义时就给它进行赋值操作,这个赋值操作只有一瞬间的赋值动作,所以大部分是静态的,称之为静态初始化;而数组的动态初始化是数组在定义时不给它赋值,而使用循环来对其进行赋值操作,由于赋值是在循环中一直发生的,所以是动态的,称之为动态初始化。

3.静态联编和动态联编的区分:

(1)静态联编:静态联编是在程序的编译阶段就确定了程序是要调用哪一个函数,其函数的调用是确定的,又称之为早期联编,或静态约束。

(2)动态连编:指的是编译阶段不能确定将要调用的函数,只能在程序运行的时候才能确定将要调用的函数,也就是说在程序运行的时候才将函数实现和函数调用关联。也叫晚期联编或动态约束

4.实现动态联编的条件:

(1)把动态联编的行为定义为类的虚函数

(2)有父子关系的类,这个行为通常是重写的父类的虚函数

(3)使用基类指针或引用指向派生类对象,然后使用基类指针调用虚函数成员(这可以实现不同对象实现不同的操作)

***动态联编最显著的表现就是多态

二,多态:

1.什么是多态:

同一个接口(函数),通过不同的对象调用就有不同的效果

2.多态的实现:

需要虚函数,就是在类中的函数成员前面加一个 virtual 关键字

3.虚函数的特点:

(1)如果在类中定义了至少一个虚函数,那么系统会为这个类创造一个虚函数表

类中没有数据成员,只有普通函数成员时,该类的大小是一个字节,若给该类写了虚函数,那么该类就会变为四个字节(那一个字节是会被直接覆盖的),写多个虚函数也是一样,因为一旦写了虚函数,系统就会为这个类维护一个虚函数表,这四个字节在这个类中的表现形式为一个指针,指向一个相当于指针数组(存放着函数首地址)的空间,故占四个字节

虚函数表内存示意图:

(2)类会在没有该关键字的基础上多出 4 个字节的指针去指向这个虚函数表,在虚函数表中保存了虚函数的首地址,在调用虚函数的时候就会先到类中的虚函数表中查找虚函数,然后调用;一般函数是直接在类中找到使用的函数然后执行该函数,也就是多了一步查找虚函数表

(3)虚函数表不会被继承(也就是虚函数表的数组首地址不会被继承),但是表中的项会被继承(虚函数会被继承)

使用虚函数继承时的注意事项:使用虚函数后的继承,如果派生类中有自己的虚函数(和基类的虚函数是非同名的)是会在继承的基类的虚函数表的基础上往后添加的,而且由于这个派生类新添加的虚函数是属于派生类的,所以基类是无法访问这个派生类中新添加的虚函数的;但是如果派生类中写有和基类的虚函数同名的函数时,这个函数是会替代虚函数表中的基类虚函数的(同名函数在基类必须有virtual关键字,在派生类中就是可有可无的),也就是在虚函数表进行修改,将基类的同名函数首地址改为派生类的同名函数首地址

4.多态的一般实现方式:

使用基类指针指向基类和派生类对象来调用虚函数,这是没有必要的,一般实现多态是不会这样写的,因为直接通过对象名就可以访问虚函数了,没有必要用指针来访问;所以,多态实现方式一般会是在类对象没有名字时(动态内存开辟堆区对象)来使用指针调用虚函数,否则无法对堆区的对象进行虚函数的调用(因为无法通过对象名来进行直接访问)

CA *pa;
pa = new CB;//CB是继承CA的派生类
pa->fun();//调用派生类中的替换fun函数
delete pa;//写了基类虚析构的话,这时可以通过派生类析构函数调用基类析构函数,即两个析构函数均被调用,虚析构函数在下面有解释

没有虚函数成员函数的访问是通过类型来进行访问的,有了虚函数之后,成员函数的访问是通过虚函数表来进行访问的

类中有虚函数,析构改为虚析构:这样派生类中就可以对基类析构函数进行重写和替换(替换是重点)

原因解释:当基类指针指向派生类对象时,如果基类的析构函数不是虚函数,那么在使用delete删除基类指针时,只会调用基类的析构函数,而不会调用派生类的析构函数,这可能导致派生类中的资源未被正确释放,造成内存泄漏。通过将基类的析构函数声明为虚析构函数,可以确保在删除派生类对象时,会依次调用派生类和基类的析构函数,从而安全释放所有相关资源。(因为调用派生类的析构函数时就会先调用基类的析构函数)

三,抽象类:

1、抽象类也是一个类,只不过不能拿来定义对象

2、抽象类是用来描述一些公有的属性和行为的

3、一个类中拥有至少一个纯虚函数,这个类就变为了抽象类

4 、子类如果继承了抽象类,那么子类必须重写抽象类中的所有纯虚函数 ( 构造析构除外 ) ,否则子类也会变为抽象类,没有函数实现就是抽象类(除构造析构)

5、纯虚函数的定义:virtual void fun()=0;//不需要实现

不能用抽象类类型来定义对象(因为里面有函数没有定义),但是抽象类可以用作指针的类型,因为可以指向派生类的重写的基类纯虚函数(重写后就不是纯虚函数了)

四,final:

1.在虚函数的后面加修饰:

  • 在虚函数后面加上final修饰符表示该虚函数是“最终的”,即不能在派生类中被重写(覆盖)。

  • 如果一个虚函数被声明为final,那么任何尝试在派生类中重新定义该函数的行为都会导致编译错误。

  • 这种方式可以用来阻止进一步的继承层次中对该虚函数的重写,确保该函数在派生类中不会被修改。在这种情况下,使用基类指针来调用有final函数派生类的下一个派生类的该函数时,就会调用到有final函数的类的该重写函数

2.在定义类的后面加修饰:

  • 在定义类后面加上final修饰符表示该类是“最终的”,即不能被继承。

  • 如果一个类被声明为final,那么任何尝试从该类派生出新的子类的行为都会导致编译错误。

  • 这种方式可以用来阻止进一步的继承,确保该类不会被用作基类。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI研报:从Sora看多模态大模型发展

《从Sora看多模态大模型发展》的研报来自浙商证券,写于2024年2月。 这篇报告主要探讨了多模态大模型的发展趋势,特别是OpenAI发布的视频生成模型Sora,以及其对行业发展的影响。以下是报告的核心内容概述: Sora模型的发布&#x…

【C++航海王:追寻罗杰的编程之路】queue

目录 1 -> queue的介绍和使用 1.1 -> queue的介绍 1.2 -> queue的使用 1.3 -> queue的模拟实现 1 -> queue的介绍和使用 1.1 -> queue的介绍 queue的文档介绍 1. 队列是一种容器适配器,专门用于在FIFO(先进先出)上下文中操作,其…

C语言例4-4:putchar()函数的调用格式和使用的例子

代码如下&#xff1a; //putchar()函数的调用格式和使用的例子 #include<stdio.h> //编译预处理命令&#xff0c;即文件包含命令 int main(void) {char ch1N, ch2E, ch3W;putchar(ch1);putchar(ch2);putchar(ch3); //输出变量c1、c2和c3中的字符putchar(\n);putcha…

Protocol Buffers设计要点

概述 一种开源跨平台的序列化结构化数据的协议。可用于存储数据或在网络上进行数据通信。它提供了用于描述数据结构的接口描述语言&#xff08;IDL&#xff09;&#xff0c;也提供了根据 IDL 产生代码的程序工具。Protocol Buffers的设计目标是简单和性能&#xff0c;所以与 XM…

长安链共识算法切换:动态调整,灵活可变

#功能发布 长安链3.0正式版发布了多个重点功能&#xff0c;包括共识算法切换、支持java智能合约引擎、支持后量子密码、web3生态兼容等。我们接下来为大家详细介绍新功能的设计、应用与规划。 随着长安链应用愈加成熟与广泛&#xff0c;一些在生产中很实用的需求浮出水面。长安…

MySQL进阶-----索引的结构与分类

目录 前言 一、认识索引 二、索引结构 1.概述 2. 二叉树 3 .B-Tree 4.BTree 5.Hash 三、索引的分类 1 .索引分类 2 .聚集索引&二级索引 前言 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维…

基于nginx 动态 URL反向代理的实现

背景&#xff1a; 我们在项目中在这样一个场景&#xff0c;用户需要使用固定的软件资源&#xff0c;这些资源是以服务器或者以容器形式存在的。 资源以webAPI方式在内网向外提供接口&#xff0c;资源分类多种类型&#xff0c;每种类型的资源程序和Wapi参数都一样。这些资源部属…

javaWeb在线考试系统

一、简介 在线考试系统是现代教育中一项重要的辅助教学工具&#xff0c;它为学生提供了便捷的考试方式&#xff0c;同时也为教师提供了高效的考试管理方式。我设计了一个基于JavaWeb的在线考试系统&#xff0c;该系统包括三个角色&#xff1a;管理员、老师和学生。管理员拥有菜…

ubuntu2004自动更新内核导致nvidia驱动无法正常启动的问题

症状 开机后&#xff0c;nvidia-smi无法正常显示显卡状态&#xff0c;另外无法连接多个显示屏 解决 参考这个文章&#xff1a; ls /usr/src可以看到已安装的nvidia驱动版本是nvidia-535.54.03 然后运行下面的指令&#xff1a; sudo apt-get install dkmssudo dkms instal…

Mimikatz介绍

一、Mimikatz定义 mimikatz是benjamin使用C语言编写的一款非常强大的安全工具&#xff0c;它可以从机器内存中提取明文密码、密码Hash、PIN码和Kerberos票据等。它的功能非常强大&#xff0c;得到全球安全研究员的广泛使用。 Mimikatz 是一款功能强大的轻量级调试神器&#xff…

Java版直播商城免 费 搭 建:平台规划与常见营销模式,电商源码、小程序、三级分销及详解

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

在vue中使用echarts饼图示例

1.安装 npm install echarts --save 2.官方示例 option {title: {text: Referer of a Website,subtext: Fake Data,left: center},tooltip: {trigger: item},legend: {orient: vertical,left: left},series: [{name: Access From,type: pie,radius: 50%,data: [{ value: 104…

巧用cpl文件维权和免杀(下)

cpl文件的应用 bypass Windows AppLocker 什么是Windows AppLocker: AppLocker即“应用程序控制策略”&#xff0c;是Windows 7系统中新增加的一项安全功能。在win7以上的系统中默认都集成了该功能。 默认的Applocker规则集合,可以看到cpl并不在默认规则中: 开启Applocker规…

NVIDIA NIM 提供优化的推理微服务以大规模部署 AI 模型

NVIDIA NIM 提供优化的推理微服务以大规模部署 AI 模型 生成式人工智能的采用率显着上升。 在 2022 年 OpenAI ChatGPT 推出的推动下&#xff0c;这项新技术在几个月内就积累了超过 1 亿用户&#xff0c;并推动了几乎所有行业的开发活动激增。 到 2023 年&#xff0c;开发人员…

聊一聊常见的网络安全模型

目录 一、概述 二、基于时间的PDR模型 2.1 模型概念提出者 2.2 模型图 2.3 模型内容 2.3.1 Protection&#xff08;保护&#xff09; 2.3.2 Detection&#xff08;检测&#xff09; 2.3.3 Response&#xff08;响应&#xff09; 2.4 PDR模型思想 2.4.1 PDR模型假设 2…

【k8s】kubeasz 3.6.3 + virtualbox 搭建本地虚拟机openeuler 22.03 三节点集群 离线方案

kubeasz项目源码地址 GitHub - easzlab/kubeasz: 使用Ansible脚本安装K8S集群&#xff0c;介绍组件交互原理&#xff0c;方便直接&#xff0c;不受国内网络环境影响 拉取代码&#xff0c;并切换到最近发布的分支 git clone https://github.com/easzlab/kubeasz cd kubeasz gi…

【openGL4.x手册10】基元程序集和面部剔除

https://www.khronos.org/opengl/wiki/Face_Culling 一、说明 基元汇编是 OpenGL 渲染管道中的阶段&#xff0c;在该阶段&#xff0c;基元被划分为一系列单独的基本基元。经过一些小的处理后&#xff0c;如下所述&#xff0c;它们被传递到光栅器进行渲染。 二 早期原始组装 基…

Spring实例化Bean的三种方式

参考资料&#xff1a; Core Technologies 核心技术 spring实例化bean的三种方式 构造器来实例化bean 静态工厂方法实例化bean 非静态工厂方法实例化bean_spring中有参构造器实例化-CSDN博客 1. 构造函数 1.1. 空参构造函数 下面这样表示调用空参构造函数&#xff0c;使用p…

npm ERR! cb() never called!(已解决)

从仓库拉下来的代码&#xff0c;用npm install时报错 试了很多种方法&#xff0c;结果发现有一种可能是你的node版本过低导致的&#xff0c;可以升级node版本试一下。 node版本升级后&#xff0c;把上一次npm install错误的node_modules删除&#xff0c;重新npm install。

压力测试面试题及答案!

压力测试是软件测试中的一种测试方式&#xff0c;用于评估软件系统在各种压力条件下的性能表现。以下是常见的压力测试面试题及答案&#xff1a; 什么是压力测试&#xff1f; 压力测试是一种测试方式&#xff0c;用于模拟实际用户在正常和峰值负载条件下对软件系统施加的压力&…
最新文章