c++进阶---c++三大特性之一---多态

news2025/1/23 9:47:16

多态的简单介绍:是一种动态的访问函数,比如:你定义了一个一个人类和一个学生类,当你传入的是学生类的时候,你需要有购物优惠,这种情境下用多态就很适用。

1.简单的多态使用:

1.1构造多态的条件:

(1)子类和父类中有同名函数,返回值,参数均相同(构成重写)

(2)基类的函数必须用virtual限定,子类可以不用,但是要注意下面代码的情况

(3)在使用多态的时候,需要使用基类去访问

1.2使用多态的一个小例子

#include <iostream>
class A {
public :
	virtual void fun(int val = 1) {
		std::cout << "A->" << val << std::endl;
	}
	virtual void test() {
		fun();
	}
};
class B:public A{
public:
	void fun(int val = 0) {
		std::cout << "B->" << val << std::endl;
	}
};
int main() {
	B* p = new B;
	p->test();
	return 0;
}

这个代码打印的结果是B->1;

让我们详细地走这个代码的允许过程:

首先使用 new B创建了一个B对象,但是因为B没用显示构造,所以直接使用默认构造(同理基类)然后把B对象的地址给了指针P,然后访问test(),因为在B中没有test函数,所以就传了A的this进去A类中找,成功找到test(),又需要去走fun(),因为现在的this指针是A类的,又fun()均用virtual修饰了,所以构成多态,但是这里又有一个大坑,就是派生类没有使用virtual修饰(正常是需要修饰的),派生类的函数就变成了virtual void fun(int val=1)直接把基类的完成拷贝了一份下来。

2.虚函数:

2.1虚函数的简单介绍

在上面的例子中,出现了virtual关键字,在对象成员函数前面加这个的函数就叫做虚函数,虚函数主要是为了用于实现多态。

2.2虚函数的重写(覆盖)和重定义

当子类和父类中函数的返回值和参数均一致,且父类有virtual时就会构成重写,当子类或者父类中出现一个虚函数,另外一个出现一个不是虚函数的对应函数称之为重定义。

2.3两个与重写相关的关键字

2.3.1 override

把这个放在派生类重写的函数后,如果没有构成重写,就会报错。

2.3.2 final

如果把这个放在基类虚函数的后面,就会限定它不能被重写。

2.4析构函数的多态使用

为什么析构函数最好就要构成多态?

如果不构成多态的话,那么怎么使用p3子类的析构函数?

所以析构需要构造多态!

3.纯虚函数与抽象类:

当你有一种类似于车这种类,这种类在现实中并没有实体,简单来说,现实中是不是说的车都是挂在品牌的?

class Car {
	virtual void fun() = 0;
};

这种情况下就有了纯虚函数的定义,也就是 =0的这个,有这个就是纯虚函数,这种类是无法实例出对象的,如果继承它的类没有对他进行重构,那也无法实例出对象。这种类就叫做抽象类。

那这个是怎么用呢?看下面的代码,注意一个地方,虽然无法实例化,但是可以使用指针,因为要构成多态!!

4.从底层来看这个虚函数和多态:

从代码可以看出,虚函数表是不同的,子类和父类均有属于自己的虚函数表,虚函数是在代码段的,虚函数表是在常量段的,很容易就能猜想到一个类定义多个对象共享一个虚函数表。

如何验证虚函数表是在常量段的?取字符串的地址和以下获取的地址进行比较。(虚函数指针数组一般都是在对应对象内存的开头,如果要看地址的时候可以*(int*)对象指针,先int*转化会变成4个字节的大小(x86)的指针,解引用就是函数虚表指针数组的第一个,再解引用就能取得其地址。)

根据这个虚函数指针数组也就能知道其怎么做到动态访问的:

你用子类剪切给父类对象去访问的时候,虚表还是子类的,访问虚函数不还是访问子类的?其次就是如果没有虚函数概念的话,那显然就是该访问啥访问啥

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

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

相关文章

安卓程序作为web服务端的技术实现(二):Room 实现数据存储

已经实现web服务器安卓程序作为web服务端的技术实现&#xff1a;AndServer 实现登录权限拦截-CSDN博客 现在需要和正常web项目类似&#xff0c;那么就需要操作数据库 一般web项目都是选择较为重型的数据库如MySQL&#xff0c;SQL server等 这里是安卓项目&#xff0c;我目前…

如何使用Python脚本将本地项目上传到 GitHub

前言 这里我们通过创建一个新的github仓库&#xff0c;来测试我们的脚本能否上传我们本地的项目&#xff0c;并且进行更新。首先你需要先安装 Git&#xff0c;关于这部分我好像没有记录过&#xff0c;这里我搜索看了一下&#xff0c;这篇博客写的Git安装详解应该是比较齐全的&…

Day 15 卡玛笔记

这是基于代码随想录的每日打卡 222. 完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#x…

IO进程----进程

进程 什么是进程 进程和程序的区别 概念&#xff1a; 程序&#xff1a;编译好的可执行文件 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 程序是静态的&#xff0c;没有任何执行的概念 进程&#xff1a;一个独立的可调度的任务 执行一个程序分配资…

【Postgres_Python】使用python脚本将多个PG数据库合并为一个PG数据库

需要合并的多个PG数据库表个数和结构一致&#xff0c;这里提供一种思路&#xff0c;选择sql语句insert插入的方式进行&#xff0c;即将其他PG数据库的每个表内容插入到一个PG数据库中完成数据库合并 示例代码说明&#xff1a; 选择一个数据库导出表结构为.sql文件&#xff08…

微软预测 AI 2025,AI Agents 重塑工作形式

1月初&#xff0c;微软在官网发布了2025年6大AI预测&#xff0c;分别是&#xff1a;AI模型将变得更加强大和有用、AI Agents将彻底改变工作方式、AI伴侣将支持日常生活、AI资源的利用将更高效、测试与定制是开发AI的关键以及AI将加速科学研究突破。 值得一提的是&#xff0c;微…

《Java核心技术 卷II》获取Web数据提交表单数据

提交表单数据 了解即可&#xff0c;直接上案例 package 第4章网络.post;import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.Reader; import java.net.CookieHandler; import java.net.CookieManager; import java.net.Co…

Spring Boot AOP实现动态数据脱敏

依赖&配置 <!-- Spring Boot AOP起步依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>/*** Author: 说淑人* Date: 2025/1/18 23:03* Desc…

JavaScript —— 变量与运算符

变量与常量 let&#xff1a;用来定义变量&#xff0c;可以只声明不定义&#xff1b; 例如&#xff1a; <script type"module">let a; // 只声明不定义let x 2, name "kitty"; // 定义若干个变量let d { // 定义一个对象&#xff0c;类似于p…

YOLO-cls训练及踩坑记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、模型训练 二、测试 三、踩坑记录 1、推理时设置的imgsz不生效 方法一&#xff1a; 方法二&#xff1a; 2、Windows下torchvision版本问题导致报错 总结 前…

Android BitmapShader简洁实现马赛克,Kotlin(一)

Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;一&#xff09; 这一篇&#xff0c; Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果&#xff0c;Kotlin&#xff08;3&#xff09;-CSDN博客 基于PorterDuffXfermode实现马…

全球化趋势与中资企业出海背景

1. 全球化趋势与中资企业出海背景 1.1 全球经济格局变化 全球经济格局正经历深刻变革&#xff0c;新兴经济体崛起&#xff0c;全球产业链重塑&#xff0c;中资企业出海面临新机遇与挑战。据世界银行数据&#xff0c;新兴市场和发展中经济体在全球 GDP 中占比已超 40%&#xff…

无人机在城市执法监管中的应用:技术革新与监管挑战

随着科技的不断进步&#xff0c;无人机技术在城市管理中的应用越来越广泛。无人机以其灵活性、高效性和低成本的优势&#xff0c;正在逐渐成为城市执法监管的得力助手。本文将探讨无人机在城市执法监管中的应用现状、技术优势以及面临的挑战。 无人机技术在城市执法监管中的应用…

总结6..

背包问题的解决过程 在解决问题之前&#xff0c;为描述方便&#xff0c;首先定义一些变量&#xff1a;Vi表示第 i 个物品的价值&#xff0c;Wi表示第 i 个物品的体积&#xff0c;定义V(i,j)&#xff1a;当前背包容量 j&#xff0c;前 i 个物品最佳组合对应的价值&#xff0c;同…

【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾

我的2024年创作之旅&#xff1a;从C语言到人工智能&#xff0c;个人成长与突破的全景回顾 引言 回望2024年&#xff0c;我不仅收获了技术上的成长&#xff0c;更收获了来自CSDN平台上无数粉丝、朋友以及网友们的支持与鼓励。在这条创作之路上&#xff0c;CSDN不仅是我展示技术成…

等变即插即用图像重建

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 即插即用算法为解决反问题成像问题提供了一个流行的框架&#xff0c;该框架依赖于通过降噪器隐式定义图像先验。这些算法可以利用强大的预训练降噪器来解决各种成像任务&#xff0c;从而避免了在每…

MLCC电容、铝电解电容寿命计算及影响分析

如何评价MLCC的寿命 MLCC的寿命受温度条件和施加的DC电压条件影响&#xff0c;可以用下列加速方程式来表示。 例如&#xff0c;85oC,16V条件的高温负荷测试是比65oC4V环境高2,374.16倍的加速测试&#xff0c;MTTF(测试样本数40pcs,可信度60%情况下)预计为103,562,200h&#…

集成学习算法

集成学习算法 一、集成学习介绍 二、随机森林算法 1、Bootstrap随机抽样 2、Bagging 算法 3、训练算法 4、代码实现 三、Boosting 算法 AdaBoost 算法 1、强分类器与弱分类器 2、训练算法 3、代码实现 一、集成学习介绍 集成学习是通过多个模型的组合形成一个精度更…

算法6(力扣148)-排序链表

1、问题 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 2、采用例子 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 3、实现思路 将链表拆分成节点&#xff0c;存入数组使用sort排序&#xff0c;再用reduce重建链接 4、具…

DNA结合之Motif_1:CNN

1&#xff0c;首先可以识别在KO前后的motif——》由CNN模型做出识别&#xff0c;看看这个有没有什么灵感 2&#xff0c;ZNF143等都可以使用来识别 3&#xff0c;暂时只使用单个peak文件&#xff0c;后期可以使用ENCODE中所有的对应的TF的peak文件 1&#xff0c;文件解压之后…