总结继承和多态的一些问题

news2024/10/7 10:13:21

在学习了继承和多态后,本人有以下容易造成混乱的点以及问题:

1.区分虚表和虚基表

虚表即虚函数表,存储的是虚函数的地址。另外:虚表是在编译阶段就生成的,一般存在于常量区(代码段)。

虚基表是是存储偏移量的。

注意要区分好:虚表存储的是虚函数的地址!!!而虚函数,是存在代码段中的。

2.区分虚表和虚表指针生成阶段

虚表是在编译阶段就生成的了,而虚表指针是在构造函数初始化列表阶段初始化的。这也侧面回答了下一个问题。

3.构造函可以是虚函数吗?

不行的,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。

4.区分切片和派生类虚表的生成

先来说派生类生成虚表的步骤:

①先是继承了基类的虚表,是把基类的虚表拷贝下来了。

②然后根据重写的虚函数,对虚表进行覆盖。

③最后是把自个类中的虚函数的地址也写进虚表中。

也就是说,派生类的虚表一开始是对基类的虚表的一个拷贝,后面才将其“本土化”。

切片:

我们都知道,多态的的条件是虚函数的重写和必须通过基类的指针或者引用调用虚函数。。那么为什么一定是需要基类的指针或引用呢?

先来看看不用指针或引用,也就是使用基类对象来调用虚函数。当传入的是派生类的对象,然后进行切片,此时我们假设基类对象对派生类对象切片的时候,不仅把属于自己的那一部分拷贝了过去, 还把派生类的虚表也拷贝了过去!如果后面需要基类的虚表的话就找不到了,这也就乱套了。因此,事实上,基类对象对派生类对象切片的时候,不会把派生类的虚表也拷贝过去,切片后将派生类中属于基类的一部分拷贝过去后,此时基类的虚表还是原本的虚表!基类原本的虚表里面都没有派生类重写的虚函数的地址,还要怎么构成多态?

因此,简单的总结就是:派生类对象赋值给基类对象,切片会把派生类中包含的基类成员变量的值拷贝过去,但是派生类的虚表不会给拷贝过去,则函数中这个基类对象的虚表是基类的,所以无法实现多态。而指针或者引用是直接指向派生类对象,不会进行拷贝赋值,这样虚函数表是派生类的虚函数表,故能实现多态。

 

5.inline函数可以是虚函数吗?

内联函数可以写成虚函数,不过写出虚函数后,这个内联函数就不是内联函数了。

6.静态成员可以是虚函数吗?

不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。

7.析构函数可以虚函数吗?

基类的析构函数最好是虚函数。因为有时候我们难免会用基类创建对象,而这个基类的对象指向的是派生类的,基类的析构函数是虚函数的话,可以准确地调用派生类的析构函数。

8.对象访问普通函数快还是虚函数更快?

首先如果是普通对象,是一样快的。如果是指针对象或者是引用对象,则调用的普通函数快,因为构成多态,运行时调用虚函数需要到虚函数表中去查找。

9.什么是抽象类?抽象类的作用?

一个类中的虚函数如果是纯虚函数的话,那么这个类便是抽象类。另外,纯虚函数可以有函数实体,但是没必要。

抽象类的作用是强制重写虚函数。另外抽象类体现出了接口继承关系


大家如果还有什么问题需要补充的话可以评论告诉我哦!

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

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

相关文章

Apache Spark 机器学习 特征转换 2

PCA(Principal Component Analysis) 该转换器是主成分分析方法,是统计学领域中对数据样本的正相关的转换与分析方法,在一批具有相关性的数据样本的数据集中,删除多余的重复的相关变量,得到少量具有信息代表…

一刷代码随想录——贪心算法

1.理论基础通过局部最优,推出整体最优。2.分发饼干 455题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们…

Softmax Classifier 多分类问题

文章目录8、Softmax Classifier 多分类问题8.1 Revision8.2 Softmax8.2.1 Design8.2.2 Softmax Layer8.2.3 NLLLoss vs CrossEntropyLoss8.2.4 Mini-Batch8.3 MNIST dataset8.3.1 Import Package8.3.2 Prepare Dataset8.3.3 Design Model8.3.4 Construct Loss and Optimizer8.3…

农业气象站—提供多元化数据

中国气象局应急减灾与公共服务司司长王志华曾表示,“农业气象灾害风险预警是守住粮食安全底线的关键一环。”在全球新冠肺炎疫情常态化的形势下,我国将粮食安全摆在了更突出的位置。 粮食在我国具有重要的战略地位,自从建国以来,…

功能测试(环境搭建)

目录 1.功能测试流程: 2.环境搭建(源码) 2.1.环境说明(后台): 2.2.代码仓库获取代码 2.3.项目环境搭建 2.4后台部署 3.环境搭建(war包) 1.功能测试流程: 2.环境搭建…

【C++初阶】八、STL---list(总)|list的介绍|list的使用

目录 一、list的介绍 二、list的使用 2.1 Construct 2.2 operator 2.3 Iterators 2.4 Capacity 2.5 Element access 2.6 Modifiers 2.7 Operations 一、list的介绍 有数据结构作为基础,STL 上手很快,学习成本也低,本文也是讲解 list…

大数据技术架构(组件)17——Hive:UDF/UDTF/UDAF三者区别

1.4.12、三者区别1.4.12.1、UDFUDF全称为User Defined Function(即用户自定义函数),UDF开发在日常工作当中是非常普遍的。我们写一段SQL,调用UDF,得到结果就算是结束了,但大家有没有想过UDF底层是怎么执行的…

CSS语法指南

学前需求 需要对HTML有一定的了解 什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CS…

操作系统—王道考研之进程管理

by:星辰 课程视频链接:https://www.bilibili.com/video/BV1YE411D7nH 第 2 章 进程管理 2.1 进程与线程 2.1.1 进程的定义、特征、组成、组织 2.1.1.1 总览 2.1.1.2 进程的定义 (1)程序的概念 程序:一组计算机能识别和执行的指令。 是静…

C语言及算法设计课程实验五:循环结构程序设计

C语言及算法设计课程实验五:循环结构程序设计一、实验目的二、实验内容2.1、统计字符个数2.2、输出所有的“水仙花数”2.3、猴子吃桃问题2.4、牛顿迭代法求方程三、实验步骤3.1、循环结构程序设计实验题目一:统计字符个数1、定义变量2、 输入一串字符3、…

基础IO(上)

基础IO(上)回顾文件知识回顾C文件接口系统文件I/O接口介绍openclosewriteread理解文件描述符fd理解0 1 2 3 4....文件描述符的分配规则重定向的本质及相关操作认识重定向重定向的具体原理重定向的操作追加重定向和输入重定向追加重定向输入重定向缓冲区的…

C++ STL源码剖析 笔记补充

写在前面 简单记录一些《C STL源码剖析中》涉及到的C语法和注意事项。 1. 静态常量成员在类内直接初始化 如果含有const static integral类型的成员变量,可以在类内定义时直接初始化; 注意integral不只是int类型,而是包含所有的整型&#…

< 每日算法 - Javascript解析:经典弹珠游戏 >

每日算法 - JavaScript解析:弹珠游戏一、任务描述:》 示例一:》示例二二、题意解析三、解决方案:往期内容 💨一、任务描述: 欢迎各位来到「力扣嘉年华」,接下来将为各位介绍在活动中广受好评的…

HSAF实战收获

收获1:MySQL数据类型对应Java类型表格这里的timestamp类型在Java中对应TimeStamp类型,varchar和char都是对饮的String类型收获2:TableFieldTableField(exist false) 注解加载bean属性上,表示当前属性不是数据库的字段&#xff0c…

[golang Web开发] 4.golang web开发:模板引擎

一.简介 使用 Go 的 Web 模板引擎需要以下两个步骤: (1).对文本格式的模板源进行语法分析,创建一个经过语法分析的模板结构,其中模板源既可以是一个字符串,也可以是模板文件中包含的内容 (2).执行经过语法分析的模板,将ResponseWr…

Django User模型

Django User模型用户管理自定义用户模型Django自定义验证引用User模型视图开发创建序列器创建视图创建路由用户注册注册序列化器注册视图注册路由用户管理 在开发登录功能的时候需要数据库来保存用户登录信息和状态,Django中有个内置app 名为 django.contrib.auth …

ICT是什么

信息与通信技术(ICT,information and communications technology)是一个涵盖性术语,覆盖了所有通信设备或应用软件:比如说,收音机、电视、移动电话、计算机、网络硬件和软件、卫星系统,等等&…

(1)Nginx简介和安装教程

目录 一、下载 二、报错提醒&环境安装 1、安装gcc编译器 2、安装perl库 3、安装 zlib库 4、也可通过命令进行统一安装 三、编译及安装 四、启动并访问 1、启动 2、访问 3、问题排查 五、安装成系统文件 一、下载 官网地址:nginx news Nginx官网提供…

OAuth2入门

1.下载资源 演示代码: OAuth2-example: 演示OAuth2的认证流程https://gitee.com/lisenaq/oauth2-example克隆下载到本地: 导入项目: client 客户 authorization-server 认证服务 resource-owner 资源所有者 resource-server 资源…

儿童台灯哪个品牌更护眼推荐?儿童书桌台灯品牌排行榜

不难发现,近些年我国儿童近视率增长迅速,随着生活条件越来越好,对电子章产品的普及非常广泛,每个家庭的孩子必不可少的就是伏案完成作业,这样的话就需要使用到台灯,选购台灯的时候最好选择适合儿童的专业护…