基类指针、虚纯虚函数、多态性、虚析构

news/2025/3/17 19:43:17/文章来源:https://www.cnblogs.com/aclq/p/18503536

多态

基类指针

//  父类指针可以 new 一个子类对象
Human *pman = new Man();
Human *pwman = new Wonan();

抛出问题:父类指针没有办法调用子类的成员函数,那么你为什么还让父类指针 new 一个子类对象呢?
下面与虚函数搭配

虚函数(动态绑定)

我们只定义一个对象指针,就能够调用父类,以及各个子类的同名函数? ===> 有,这个对象指针,它的类型必须是父类类型
对这个函数有要求:

  1. 父类中,函数声明之前要加 virtual 声明成虚函数
  2. 一旦某个函数(在基类)被声明成了虚函数,那么所有派生类(子类)中同名函数都是虚函数
Human *phuman = new Men();
phuman->eat();  //  调用的是 Men 类的 eat 函数
delete phuman;  //  new 的对象使用完之后要 delete,防止内存泄漏phuman = new Women();
phuman->eat();  //  调用的是 Women 类的 eat 函数
delete phuman;phuman = new Human();
phuman->eat();  //  调用的是 Human 类的 eat 函数
delete phuman;

override

注意:为了避免你在子类中写错虚函数,在 C++11 中,你可以在函数声明这里增加一个 override 关键字
这个关键字在 "子类" 中,而且是子虚函数专用

override就是用来说明派生类中的虚函数,你用了这个关键字之后,编译器就会认为你这个 函数就是覆盖了父类中的同名函数。
只有虚函数才存在子类可以覆盖父类中同名函数的问题,那么编译器就会在父类中找同名同参的虚函数,如果没找到,编译器就会报错、

final

final 也是虚函数专用,是用在父类,如果我们在父类的函数声明中加了 final,那么任何尝试覆盖该函数的操作都将引发错误。

virtual void eat() final;

多态性

系统内部实际上是要查一个虚函数表,找到 eat() 的入口地址,从而调用父类或者子类的 eat() 函数,这就是运行时期的多态性

纯虚函数【类似 Java 中的接口 interface】===> 函数原型后增加 = 0

纯虚函数:没有函数体,只有一个函数声明

virtual void eat() = 0;

是在基类中声明的虚函数,但是它在基类中没有定义,但是要求任何派生类都要定义该虚函数自己的实现方法
注意:一旦一个类中有纯虚函数了,那么你就不能生成这个类的对象了【Java 中 interface 不能生成对象】
抽象类不能用来生成对象,主要目的用来统一管理子类对象

基类的析构函数一般写成虚函数(虚析构函数)

// 1. 声明一个 men 对象
Men men;
// 2. 写法2:使用 new
Men *pmen = new Men();
delete pmen;  //  自己 new 的对象,必须使用 delete 调用析构函数


有一个问题

Human *phuman = new Men();  //  父类指针指向 子类对象
delete phuman;  //  没有执行子类的析构函数

结论:用基类指针 new子类的对象,在 delete 的时候,系统不会调用派生类的析构函数,这肯定就有问题了

解决方式:

  1. 父类的析构函数写成虚函数
  2. 继承时候使用 public

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

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

相关文章

SATA和NVMe SSD在速度上有多大差异

SATA和NVMe SSD在速度上的差异主要体现在:一、传输接口和带宽能力差异;二、读写速度的差异;三、应用场景和效率的差异;四、价格和市场趋势的差异;五、未来发展的差异。实际上,NVMe SSD在速度上远超SATA SSD,特别适合需要高速数据处理的应用场景,如高端游戏、视频编辑和…

Serverless技术栈推荐

# Serverless技术栈推荐 在探讨Serverless技术栈推荐时,我们首先要明确Serverless的核心优势:无需管理服务器、按需自动扩展、成本效益高、开发效率提高。其中,无需管理服务器是Serverless技术的标志性特征,它允许开发者专注于代码和业务逻辑的实现,而无需担心底层基础设施…

Java面试真题之中级进阶(线程,进程,序列化,IO流,NIO)

前言 本来想着给自己放松一下,刷刷博客,慕然回首,线程、程序、进程?Java 序列化?Java 中 IO 流? Java IO与 NIO的区别(补充)?似乎有点模糊了,那就大概看一下Java基础面试题吧。好记性不如烂键盘 *** 12万字的java面试题整理 *** 简述线程、程序、进程的基本概念。以及…

JUC包下的类

1.原子操作类(Atomic) 在Java运算的多线程环境下进行运算若没有进行额外的同步操作,就是线程不安全的多线程并发共享必然会遇到问题所以可以用原子类解决 (1)AtomicInteger 提供了一个原子性的整数变量,可以进行原子性的加减操作。 (2)AtomicLong 提供了一个原子性的长整型…

一般的Java项目需要JVM调优吗_1

在大多数情况下,Java项目不一定需要进行JVM调优。当项目运行稳定、系统资源没有过分消耗时,调优可能是不必要的工作,并且JVM的现代垃圾收集器已被设计得足够智能,适用于大多数场景。然而,在处理大型应用程序、高并发系统,或者面临复杂的性能要求时,JVM调优则成为确保性能…

教你如何在GitHub手机端中怎么下载代码

要在GitHub手机端下载代码,首先要明确你的目标和需求。接下来,我们将详细介绍如何进行这一操作,包括:1. 登录GitHub账号;2. 搜索并定位到目标代码仓库;3. 使用”Download”或”Clone”选项下载;4. 选择合适的格式;5. 确认下载到手机上的位置。手机下载代码的方式较PC端…

蚁群算法的优势在哪里

标题:蚁群算法的优势所在 摘要:蚁群算法,一种模拟蚂蚁觅食行为的启发式算法,因其1、灵活性高、2、适用范围广、3、优化能力强而备受推崇。特别是在解决路径优化问题上,其优化能力强表现尤为突出,通过模拟蚂蚁留下信息素来寻找最短路径,有效地解决了复杂系统中的优化问题…

项目管理的流程是什么

项目管理的流程通常遵循一系列阶段和步骤,以确保项目按时、按预算、按质量完成。以下是通常的项目管理流程:一、项目启动阶段;二、项目规划阶段;三、项目执行阶段;四、项目监控与控制阶段;五、项目闭环阶段;六、项目结束阶段。项目管理工具和方法也可以根据不同的项目需…

Windows 系统 SQL Server 配置使用安全模式

Server=127.0.0.1;Integrated Security=SSPI;Database=LuoCore;

如何建立项目进度恢复策略以应对重大延误

在面对项目重大延误时,有效的项目进度恢复策略至关重要。这些策略包括增加资源、优化流程、调整项目范围、重组团队和采用快速跟踪技术。在这些策略中,优化流程是一个持续的活动,最直接地提高工作效率和项目执行速度。施行优化措施时,应该紧密监控进程,减少浪费,确保每一…

Java 和 C# 最大的不同是什么

Java与C#均为高级编程语言,轮廓上有共性,但细节处昭然分歧。Java的跨平台性比C#更强,通过JVM实现在多种操作系统上运行。C#则深度整合于Microsoft平台,尽管.NET Core的推进扩展了它在非Windows环境的运作能力。接轴详述Java的跨平台特性,该特性来源于”一次编写,到处运行…

基于圆柱体镜子和光线跟踪实现镜反射观测全景观图的matlab模拟仿真

1.程序功能描述基于圆柱体镜子和光线跟踪实现镜反射观测全景观图.模拟的场景如下所示: 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序%% step1 for i = 1:mmx_new(i) = i-round(mm/2); end for i = 1:nny_new(i) = i-round(nn/2); end for i=1:m…