C++之多态

C++实现多态的条件 一.C++实现多态的条件 1.派生类对象必须赋值给基类的引用或者指向基类的指针。 2.派生类的继承方式必须是公有继承public。 如果是protected继承或者是private继承,那么子类的所有方法只能在内部访问,这时候就不需要多态了。一般会有语法报错。 3.基类中的同名函数必须定义为虚函数。 举个例子: #include<iostream> u... 阅读详情

一、多态的概念

  多态用一句话说就是执行一个事物会发生不同的情况。
  在代码中就是不同继承关系的类对象对一个函数进行操作,会有不同的结果产生。

  举个生活中的例子:比如相亲这件事,
① 长得好看并且有钱的人相亲可能百战百胜;
② 长得不好看并且又没钱的人可能就会遭到别人的冷眼且相亲失败(职业法师刘海柱那种人hhh)
这就是不同的人做不同的事得到的结果是不一样的,这就是生活中的多态。

二、多态的定义和实现

  想要实现多态,必须有三个前提条件:
1)首先多态的实现是建立在继承关系的基础上。
2)被调用的函数必须是虚函数并且完成了虚函数的重写。(重写的概念可以参见重写概念)
3)调用函数的对象的类型必须是指针或者引用。

class Beautiful_Person
{
public:
	virtual void date()
	{
		cout << "成功牵手" << endl;
	}
};

class Ugly_Person : public Beautiful_Person
{
public:
	virtual void date()
	{
		cout << "牵手失败" << endl;
	}
};

void func(Beautiful_Person& p)
{
	p.date();
}
int main()
{
	Beautiful_Person bp;
	Ugly_Person up;
	func(bp);	//传入不同的对象,得到的结果不同
	func(up);
	return 0;
}

在这里插入图片描述

三、多态的原理

  那么为什么传入不同的对象会产生不同的结果呢?
我们看一个例子:
有一道笔试题:sizeof(base)是多少?

class Base
{
public:
	virtual void func()
	{
		cout << "func" << endl;
	}
private:
	int _a;
};

我们都知道,类成员的大小只与成员变量的大小有关。所以按道理应该是 4 个字节的大小。
但是运行出的结果却是 8 个字节,这是为什么呢?
在这里插入图片描述
我们可以看下 Base 的对象模型中还有什么我们不知道的东西!
在这里插入图片描述
通过调试我们可以看到 Base 的对象模型中多了一个 __vfptr 指针,普通的对象模型中只有成员变量。可以看到这个__vfptr 指针指向的是 Base 类中的那个虚函数。
这个指针其实就是虚函数表指针(v 是 virtual 的意思,f 是function的意思)。这个虚函数指针指向的其实是一个虚函数表,在类中的虚函数指针都要放在这个虚函数表中。虚函数表也叫虚表。
梳理一下虚函数表指针、虚函数表、虚函数指针的关系如下图:
在这里插入图片描述
那我们捋一捋多态的原理:
再顺一顺刚才相亲的那段代码,过程如下图:
在这里插入图片描述
可以看出不同对象是调用不同的函数的。bp是通过自己对象模型中的虚函数表指针找到对应的虚函数,然后调用它。up 也是一样,只不过他们对象模型中的虚表指针指向的虚表中的内容是不一样的。所以调用的函数也不一样。

所以总而言之:多态的原理就是在执行某个函数时,传进的对象不同,会根据对象模型中的虚函数指针找到对应的虚函数表,在虚函数表中找到对应要执行的虚函数指针,进而找到该虚函数并执行。

四、静态多态和动态多态

1、静态多态

静态多态也叫静态绑定,就是在函数编译时期就确定程序的行为,这种就是静态多态,比如函数重载就是一个静态多态的例子。

2、动态多态

那么动态多态就是在程序运行的过程才会确定程序的具体行为,调用不同的函数。
我们可以通过汇编代码再看看动态多态为什么是运行过程才会确定程序的具体行为:
在这里插入图片描述
可以看出是在运行过程中才确定执行的是什么函数。

STM32 热敏电阻测量温度 1、硬件 STM32F103C8T6、热敏电阻传感器、OLED。 2、热敏电阻传感器的介绍 阅读详情

相关推荐

Win10下Delphi 10.4.2 (RAD Studio 10.4.2 )安装教程图解

Win10下Delphi 10.4.2 (RAD Studio 10.4.2 )安装和破解教程图解

1万+

C++多态

多态的概念: 完成某个行为,不同对象去完成将会产生不同的状态。 多态的分类: 多态分为静态多态和动态多态。 静态多态: 程序在编译期间已经确定了函数的行为。 例:函数重载、模板 动态多态: 在程序运行时才可以确定函数的行为,即在编译阶段无法确定到底要调用哪个函数。 C++中的动态多态实现条件 1.必须要处于继承的体系下 2.基类中必须要有虚函数(virtual关键字修饰的函数称之为虚函数)且在子类中必须要对基类中的虚函数进行重写) class animal { public:

m0_56910081的博客 1530

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 628

C++ 多态构成条件

多态(Polymorphism),从字面意思理解,就是一种事物具有多种状态,在C++里表示函数具有多种表达。多态一般出现在向上转型里边,也就是将派生类对象赋值给基类对象。我们直接看一个例子,就能明白为什么会出现多态。......

a1367666195的博客 713

Tessent --- PDL

当关联的ICL模块是当前ICL顶部模块时,即当它与当前设计匹配时,只能iCall一个iTopProc。但是,可以在iTopProc内调用iCall iProc或iTopProc。为指定后续iProc命令引用的ICL模块,发出这个命令之后,随后定义的iProc都会对应的ICL模块进行定义。为后续iCall调用,当使用iCall命令调用该过程时,参数列表中的变量将被替换为iCall命令中指定的值。在调用iProc时,运行iProc内的命令。PDL是面向工程师的,工程师利用PDL语言,对ICL中的单元进行控制。

qiantianyiqian的博客 2783

零基础做完YOLOv8船只检测系统:HRSC2016数据集 + 完整UI,稳过答辩

亲爱的同学,通过这篇教程,你已经掌握了“基于YOLOv8的HRSC2016微小船只检测系统”从数据集处理、模型训练到Tkinter界面开发的全流程。这个课题既贴合“海事智能化”的产业战略,又涵盖了“目标检测、深度学习、界面开发”等多个毕设评分点,非常适合作为计算机或海事工程专业的毕业设计。在实践中,你可能会遇到“海面背景复杂导致船只漏检”“微小船只识别精度不足”“UI与模型推理同步卡顿”等挑战——别担心,这些都是技术成长的必经之路。

FJN110的博客 108

C++多态的概念及前提条件(最精辟)

原文链接 在 C++ 程序中,每一个函数在内存中会分配一段存储空间,存储空间的起始地址则为函数的入口地址。例如我们在设计一个程序时都必须为程序设计一个主函数,主函数同样会在内存中被分配一段存储空间,这段存储空间的起始地址就是函数的入口地址 前面列举的所有程序中,函数的入口地址与函数名是在编译时进行绑定的,我们称之为编译期绑定 多态的功能则是将函数名动态绑定到函数入口地址,这样的动态绑定过程称为运行期绑定。 运行期绑定指的是函数名与函数入口地址在程序编译时无法绑定到一起,只有等运行的时候才确定函数

luoganttcc的博客 866

Python 爬虫实战:抓取百科网站上某个词条的详细信息

百科网站(如维基百科)为用户提供了丰富的知识内容,涵盖了从历史、文化到科技等几乎所有领域的知识。对于需要大量数据进行分析、研究或机器学习项目的开发者而言,抓取这些网站的数据显得尤为重要。通过编写一个 Python 爬虫,我们能够轻松地抓取百科网站上的某个词条及其详细信息,从而获取并整理这些知识内容。本篇博客将深入介绍如何通过 Python 编写爬虫来抓取百科网站(如维基百科)的某个词条的详细信息,包括标题、正文内容、参考文献等。requests:发送 HTTP 请求,获取页面内容。

2201_76125261的博客 1669

程序基石系列之C++多态的前提条件

C++中多态(polymorphism)有以下三个前提条件: 必须存在一个继承体系结构. 继承体系结构中的一些类必须具有同名的virtual成员函数(virtual关键字)至少有一个基类类型的指针或基类类型的引用.这个指针或引用可用来对virtual成员函数进行调用.关于Program Language更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.

松子茶的专栏 2597

vue3:最新实现腾讯人脸核身+增强版人脸核身使用方法及示例源码,Vue3如何使用腾讯云慧眼人脸核身,提供人脸核身案例、身份信息核验、活体检测与核身比对等示例代码(后端spring与thinkphp)

vue3接入腾讯人脸核身,腾讯云人脸核身Vue3+后端代码,H5人脸核身,vue3 H5如何使用腾讯人脸核身sdk,vue3+thinkphp腾讯人脸核身,Spring Boot接入腾讯云人脸核身教程,hinkphp腾讯人脸核身,vue3人脸核身插件接入流程,vue+spring boot实现腾讯人脸核身,vue3接入腾讯云【增强版人脸核身接入】,vue3 h5微信公众号网页腾讯云慧眼人脸核身,tvue3接入人脸核身SDK,vue3+typescrip+vite接入慧眼实名认证,vue3腾讯云活体人脸核身(

✅ 精选推荐文章 4119

【MATLAB】嵌入式PID控制参数整定与优化

本文提出了一种基于MATLAB仿真的嵌入式PID参数优化方法,解决了传统人工试凑法效率低、适应性差的问题。通过建立一阶滞后被控对象模型,对比分析了不同PID参数组合的性能表现,筛选出最优参数。仿真结果表明,优化后的PID参数能有效降低超调量(从传统方法的显著超调降至接近0%),缩短调节时间,提高稳态精度。最终将优化算法部署到STM32平台,实现了"仿真整定-参数优化-嵌入式落地"的完整开发流程。该方法显著提升了嵌入式系统的响应速度和控制精度,为工业控制应用提供了标准化解决方案。

unber的博客 45

【c++】cpp多态

c++多态知识与原理

hutaotaotao的博客 1304

STM32 cubeMX配置串口重定向

这篇文章主要讲解什么是串口重定向,为什么要串口串口重定向。使用printf函数和上位机通信是非常的方便的。希望大家都能够掌握。

m0_49476241的博客 4572

【CPP】类与多态

例如典中典的火车票的例子,设计一个自助售票函数,设计一个父类为乘客,设计一个子类继承自父类为学生,再设计一个子类继承自父类为军人,每个种乘客类型可以买不同价格的票,当这类对象作为参数(传引用/指针)传进一个为父类"乘客"的自助售票函数中,根据函数判断生成符合当前乘客身份的票。覆写的概念很重要,从字面意思咱就知道,子类的情况可能会和父类不太一样,此时我们就可以覆写掉父类的方法,改成我们想让子类所呈现的模式,当然,这里的覆写在底层的角度上其实说不上是覆写,这个后面的小节会提到。

2302_79981653的博客 1343

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

c++ 多态 运行时多态和编译时多态_cpp和java中多态的理解

今天写一些小技巧帮助理解cpp和java里的多态,因为c++和java在多态的实现上,稍微有一点点不同,所以这里也会列出两者的不同,以免有时候会混淆。多态是所有面向对象的编程语言中非常重要的一个特性,多态的实现,可以允许在程序运行过程中,父对象根据当前赋给他值的子对象和特性决定调用自己的方法还是子类中复写的方法。1. c++多态c++中可以通过现下面四组概念来帮助我们理解和判断多态:对象的静态类型...

weixin_39628384的博客 312

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++的多态.cpp

/*多态包括模板/重载和虚函数 *其中模板和重载属于静态多态虚函数属于动态多态 */# include using namespace std;//定义模板类template class Base {public: Base():x_(0){}; Base(T n):x_(n){};    ~Base(){ cout }; virtual T Get() { //虚函数,当基类指针指向派生

东哥的博客 392

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

CPP多态

本文涉及的指针大小为x86系统32位4字节,如果是x64程序,则需要考虑指针是8bytes问题等等多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。

z202331720425的博客 1388

多态_cpp

一、什么是多态? 1.多态的概念 在面向对象方法:向不同的对象发送同一个消息,不同的对象在接收的时会产生不同的行为(即方法) 在C++中,多态性的表现形式之一:具有不同功能的函数可用同一个函数名,这样就可以实现用一个函数名调不同内容的函数。 用现实生活中的例子来说一下动态,比如说:学校开学,不同身份的人会有不同的反应。比如老师要备课上课

apt1203JN的博客 704

cpp中三种多态

cpp中三种多态 多态(Polymorphism)是一个大家耳熟能详的概念。在传统的C++教学中,我们通常认为“多态”是函数在类继承体系中所表现出来的一种行为。比如,在下面的例子中, template <typename T> T convertFromInt(int v); void f1() { convertFromInt<float>(5); convertFromInt<double>(5); } struct Base { virt

惜兰blog 1144

cpp中的多态

多态的实现依赖于继承,在继承的基础上实现。多态需要基类和派生类的目标函数完成三同:名字同,返回值同,参数类型同。想要实现多态,还有两个重要条件:1.必须是基类的指针或者引用调用了虚函数。只有基类的指针或者引用才能即指向基类又指向派生类。2.被调用的必须是虚函数,并且完成了虚函数的重写/覆盖。使得基类和派生类有不同的函数。

weixin_69318410的博客 744

Cpp中关于多态那些事

多态(可以有多种变化的情况奥)

Template Code 841

C++——多态

上述文章我们了解什么是多态,了解了多态的原理,希望对你有所帮助。

2301_76613753的博客 2046

Cpp_多态

一、虚函数、覆盖和多态如果将基类中的某个成员函数声明为虚函数,那么其子类中与该函数具有相同原型的成员函数就也是虚函数,并且对基类中的版本形成覆盖。这时,通过指向子类对象的基类指针,或者引用子类对象的基类引用,调用虚函数,实际被执行的将是子类中的覆盖版本,而非基类中的原始版本,这种语法现象被称为多态。二、虚函数覆盖的条件1.只有类的成员函数才能被声明为虚函数,全局函数和类的静态成员函数都不能被声明为虚

Jerry的专栏 2793

【C++】多态

多态的概念多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为,这⾥我们重点讲运⾏时多态。**编译时多态(静态多态)**主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时⼀般归为静态,运⾏时归为动态。,具体点就是去完成某个⾏为(函数),可以传不同的对象就会完成不同的⾏为,就达到多种形态。⽐如买票这个⾏为,当普通⼈买票时,是全价买票;

Octopus2077的博客 2014
上一篇: 菱形继承和菱形虚拟继承(原理:虚基表)
下一篇: C++之智能指针
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值