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

简介: 本人学习了多态和继承后的一些问题,解答出来并总结,有些是容易搞混的概念。

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

1.区分虚表和虚基表

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

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

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

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

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

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

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

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

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

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

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

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

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

切片:

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

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

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

_(JAI0A(IQ2KZR7C)_~3M06.png

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

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

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

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

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

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

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

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

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

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

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

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

相关文章
【微信公众平台对接】有关【上传图文消息内的图片获取URL】调用示例
【微信公众平台对接】有关【上传图文消息内的图片获取URL】调用示例
351 0
|
C++ 容器
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(上)
【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)(上)
|
文字识别 数据处理 C++
使用.NET开发一个屏幕OCR工具
本文将介绍使用.NET开发的一款桌面截图 OCR 工具,软件已开源,地址:[https://github.com/sangyuxiaowu/Snipping_OCR](https://github.com/sangyuxiaowu/Snipping_OCR)
361 0
使用.NET开发一个屏幕OCR工具
|
Linux
全网独家:LINUX登录桌面后,如何自动运行自己的应用程序
全网独家:LINUX登录桌面后,如何自动运行自己的应用程序
248 0
|
Java 数据库 Oracle
告别迷茫!深入理解 Java 中的 ClassNotFoundException 和 NoClassDefFoundError 及排查技巧
本文深入解析 Java 中的 `ClassNotFoundException` 和 `NoClassDefFoundError`,帮助开发者告别迷茫。文章从两者的定义、发生场景、常见原因及排查技巧等方面进行详细讲解,并通过对比总结其核心区别。`ClassNotFoundException` 通常因类路径配置错误或类文件缺失导致,而 `NoClassDefFoundError` 则可能源于静态初始化失败或运行时依赖丢失。掌握这些知识,可有效解决 Java 程序中的常见运行时问题。文末附有实用参考资料,助力更深入学习。
329 0
告别迷茫!深入理解 Java 中的 ClassNotFoundException 和 NoClassDefFoundError 及排查技巧
|
3天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1101 0
|
2天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
461 9
|
12天前
|
人工智能 运维 安全
|
11天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
3天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
296 0