du制作网站/广告推广语

du制作网站,广告推广语,个人养老金怎么缴纳,做营销网站建设价格虚函数和纯虚函数的区别 虚函数和纯虚函数都用于实现多态。 虚函数 ● 虚函数是在普通函数之前加一个 virtual 关键字 ● 虚函数是在基类中声明的,并且可以在派生类中被重写。 ● 虚函数可以有实现,也就是说,基类中的虚函数可以有一个定义&…

虚函数和纯虚函数的区别

虚函数和纯虚函数都用于实现多态。

  1. 虚函数
    ● 虚函数是在普通函数之前加一个 virtual 关键字
    ● 虚函数是在基类中声明的,并且可以在派生类中被重写。
    ● 虚函数可以有实现,也就是说,基类中的虚函数可以有一个定义,派生类可以选择提供自己的实现,也可以使用基类的实现。
    ● 通过虚函数,可以在基类指针或引用中实现动态绑定,即在运行时确定调用哪个类中的函数实现。
  2. 纯虚函数
    ● 纯虚函数是在虚函数后面加一个 =0
    ● 纯虚函数也是在基类中声明的,但它没有实现,只有声明。
    ● 当一个类包含至少一个纯虚函数时,它就成为了一个抽象类,这意味着你不能实例化这样的类,但可以声明这种类型的指针或引用。
  3. 区别
    ● 是否实现:
    ○ 虚函数提供函数声明和实现,即提供虚函数的默认实现。
    ○ 纯虚函数没有函数具体实现,只提供函数声明。
    ● 派生类是否实现
    ○ 派生类可以选择是否覆盖虚函数的默认实现。
    ○ 当一个类包含至少一个纯虚函数时,派生类必须提供具体实现,否则他们也变成抽象类。
    ● 实例化:
    ○ 包含纯虚函数的类是抽象类,不能被实例化;
    ○ 而包含虚函数的类不一定是抽象类,可以被实例化,除非它也包含纯虚函数。
    ● 目的:
    ○ 虚函数用于提供一个可以在派生类中被重写的方法实现;
    ○ 通过纯虚函数,抽象类提供一种接口规范,要求派生类必须提供具体实现。
    ● 动态绑定:
    ○ 虚函数支持动态绑定,
    ○ 纯虚函数由于没有实现,它们本身不参与动态绑定,但可以作为接口的一部分,影响整个类的多态性。

虚函数怎么实现的

虚函数的实现依赖于一种称为虚函数表的机制。

  1. 虚函数表的创建: 当一个类包含虚函数时,编译器会自动为这个类创建一个虚函数表。这个表是一个函数指针数组,每个指针指向一个虚函数的实现。
  2. 虚函数表指针: 编译器会在对象的内存布局中添加一个隐式的虚函数表指针(通常是一个指向 vtable 的指针),这样每个对象都可以通过这个指针访问到类的虚函数表。
  3. 虚函数的声明: 在类中声明虚函数时,可以使用 virtual 关键字。如果一个函数被声明为虚函数,编译器会在类的 vtable 中为这个函数分配一个入口。
  4. 重写虚函数: 当从基类继承并创建派生类时,可以在派生类中重写基类的虚函数。重写的函数会替换掉 vtable 中对应的基类实现。
  5. 动态绑定: 当通过基类指针或引用调用虚函数时,程序会使用对象的虚函数表指针来查找正确的函数实现。这个过程称为动态绑定或晚期绑定。
  6. 调用虚函数: 程序运行时,当调用一个虚函数时,会先通过对象的虚函数表指针找到 vtable,然后在 vtable 中查找对应的函数指针,并调用该函数。
    简短来说,每个类都有一个虚表,里面有这个类的虚函数地址;每个对象都有指向它的类的虚表的指针,这个指针称为虚指针。 当调用虚函数时,编译器会调用对象的虚指针查找虚表,通过虚函数的地址来执行相应的虚函数。

虚函数表是什么

  1. 虚函数表是 C++ 中实现运行时多态(动态绑定)的关键机制之一。
  2. 虚函数表是一个或多个函数指针的集合,它存储了类中所有虚函数的地址。当类包含虚函数时,编译器会自动为这个类创建一个虚函数表。
  3. 虚函数表的主要目的是在运行时能够确定通过基类指针或引用调用的是哪个派生类中的虚函数实现,从而实现动态绑定。
  4. 原理
    ● 创建虚函数表:当类声明至少一个虚函数时,编译器会为这个类生成一个虚函数表。
    ● 虚函数表指针:编译器会为包含虚函数的类的对象添加一个隐藏的虚函数表指针(通常是一个指针或引用),指向类的虚函数表。
    ● 调用虚函数:当通过基类指针或引用调用虚函数时,程序会使用对象的虚函数表指针来查找并调用正确的函数实现。

什么是构造函数和析构函数?构造函数、析构函数可以是虚函数嘛?

  1. 构造函数
    ● 构造函数是创建对象时自动调用的成员函数,它的作用是初始化成员变量,为对象分配资源,执行必要的初始化操作。
    ● 特点
    ○ 函数名必须与类名相同,且没有返回类型;
    ○ 可以有多个构造函数;
    ○ 如果没有为类定义一个构造函数,编译器会自动生成一个默认构造函数,它没有参数,也可能执行一些默认的初始化操作。
    ● 构造函数不能是虚函数。
    ○ 构造函数在对象创建时被调用,此时不涉及多态性。
    ○ 虚函数对应一个虚表,这个表存在对象的内存空间,如果此时构造函数是虚函数,对象还没实例化没有分配内存空间,也就无法调用;
    ○ 虚函数是用在信息不全的情况下,能使重载的函数使用。但构造函数本身就是要初始化对象,因此没必要是虚函数。
  2. 析构函数
    ● 析构函数是对象生命周期结束时自动调用的函数,它的作用是释放对象占用的资源,执行一些必要的清理操作。
    ● 析构函数特点:
    ○ 函数名为 ~类名;
    ○ 没有参数;
    ○ 如果没有为类定义一个析构函数,编译器会自动生成一个默认析构函数,执行简单的清理操作。
    ● 析构函数可以是虚函数。
    ○ 虚析构函数可以在运行时实现多态性;
    ○ 如果基类的析构函数不是虚函数,当通过基类指针去删除派生类对象时,不会调用派生类的析构函数。可能会导致派生类的资源未被正确释放,从而造成资源泄漏

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

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

相关文章

Baklib推动企业知识管理创新与效率提升的全面探讨

内容概要 在当今数字化转型的背景下,有效的知识管理显得尤为重要。知识是企业的核心资产,而传统的管理方式往往无法充分发挥这些知识的价值。因此,企业亟需一种高效、灵活的解决方案来应对这一挑战。Baklib作为一款先进的企业级知识管理平台…

JAVA实战开源项目:网上购物商城(Vue+SpringBoot) 附源码

本文项目编号 T 041 ,文末自助获取源码 \color{red}{T041,文末自助获取源码} T041,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

访问CMOS RAM

实验内容、程序清单及运行结果 访问CMOS RAM(课本实验14) 代码如下: assume cs:code data segment time db yy/mm/dd hh:mm:ss$ ;int 21h 显示字符串,要求以$结尾 table db 9,8,7,4,2,0 ;各时间量的存放单元 data ends cod…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能? 每月 2000 代码补全,帮助开发者快速完成代码编写。 每月 …

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器,网卡绑定有2个ip地址,分别为: A:192.168.111.201 B:192.168.111.202 在这台服务器请求目标地址 C:192.168.111.203 时必须使用B作为源地址才能访问目标地址C,在这台服务器默认…

Spring Boot 日志:项目的“行车记录仪”

一、什么是Spring Boot日志 (一)日志引入 在正式介绍日志之前,我们先来看看上篇文章中(Spring Boot 配置文件)中的验证码功能的一个代码片段: 这是一段校验用户输入的验证码是否正确的后端代码&#xff0c…

Go学习:Go语言中if、switch、for语句与其他编程语言中相应语句的格式区别

Go语言中的流程控制语句逻辑结构与其他编程语言类似,格式有些不同。Go语言的流程控制中,包括if、switch、for、range、goto等语句,没有while循环。 1. if 语句 语法格式: (1)单分支: if 条件语句…

想品客老师的第九天:原型和继承

原型与继承前置看这里 原型 原型都了解了,但是不是所有对象都有对象原型 let obj1 {}console.log(obj1)let obj2 Object.create(null, {name: {value: 荷叶饭}})console.log(obj2) obj2为什么没有对象原型?obj2是完全的数据字典对象,没有…

SpringBoot--基本使用(配置、整合SpringMVC、Druid、Mybatis、基础特性)

这里写目录标题 一.介绍1.为什么依赖不需要写版本?2.启动器(Starter)是何方神圣?3.SpringBootApplication注解的功效?4.启动源码5.如何学好SpringBoot 二.SpringBoot3配置文件2.1属性配置文件使用2.2 YAML配置文件使用2.3 YAML配置文件使用2.…

98.1 AI量化开发:长文本AI金融智能体(Qwen-Long)对金融研报大批量处理与智能分析的实战应用

目录 0. 承前1. 简介1.1 通义千问(Qwen-Long)的长文本处理能力 2. 基础功能实现2.1 文件上传2.2 单文件分析2.3 多文件分析 3. 汇总代码&运行3.1 封装的工具函数3.2 主要功能特点3.3 使用示例3.4 首次运行3.5 运行结果展示 4. 注意事项4.1 文件要求4.2 错误处理机制4.3 最佳…

数据结构实战之线性表(一)

一.线性表的定义和特点 线性表的定义 线性表是一种数据结构,它包含了一系列具有相同特性的数据元素,数据元素之间存在着顺序关系。例如,26个英文字母的字符表 ( (A, B, C, ....., Z) ) 就是一个线性表,其中每个字母就是一个数据…

FreeRTOS学习 --- 中断管理

什么是中断? 让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断 中断执行机制,可简单概括为三步: 1,中断请求 外设产生中断请求(GPIO外部中断、定时器中断…

Vue+Echarts 实现青岛自定义样式地图

一、效果 二、代码 <template><div class"chart-box"><chart ref"chartQingdao" style"width: 100%; height: 100%;" :options"options" autoresize></chart></div> </template> <script> …

嵌入式知识点总结 Linux驱动 (七)-Linux驱动常用函数 uboot命令 bootcmd bootargs get_part env_get

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.ioremap 2.open 3.read 4.write 5.copy_to_user 6.copy_from_user 7.总结相关uboot命令以及函数 1.bootcmd 1.1.NAND Flash操作命令 2.bootargs 2.1 root 2.2 rootf…

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器&#xff0c;算是比较的基础容器&#xff0c;也是大家在日常开发中常用到的容器&#xff0c;因为底层用到的数据结构比较简单&#xff0c;笔者就将他们三者放到一起做下对比分析&#xff0c;介绍下基本用法&a…

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…

高精度加法乘法

高精度加法&乘法都是把数字转化成数组进行运算&#xff0c;存储 高精度加法 建议多在纸上画画&#xff0c;梳理思路 代码实现 输入字符串 //初始化数组存储 int a[250]{0}; int b[250]{0}; int c[251]{0}; //定义字符串&#xff0c;输入字符串 string s1,s2; getline(c…

Python 列表思维导图

Python 列表思维导图 腾讯云盘下载连接 https://share.weiyun.com/Ri6bUJed

获取snmp oid的小方法1(随手记)

snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值&#xff0c;找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…

【leetcode练习·二叉树】计算完全二叉树的节点数

本文参考labuladong算法笔记[拓展&#xff1a;如何计算完全二叉树的节点数 | labuladong 的算法笔记] 如果让你数一下一棵普通二叉树有多少个节点&#xff0c;这很简单&#xff0c;只要在二叉树的遍历框架上加一点代码就行了。 但是&#xff0c;力扣第第 222 题「完全二叉树的…