多态场景的一个坑

什么是多态?为什么要使用多态?什么时候用多态?多态是如何实现的?使用多态有什么好处?   在学习《大话设计模式》的时候经常会遇到多态,但什么是多态?为什么要使用多态?什么时候用多塔?多态是如何实现的?使用多态有什么好处?我们将根据以上五个问题展开激烈的讨论。 什么是多态?   多态,顾名思义指“多种形态”。多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。 例:猪、狗、猫都属于动物类,我们将动物类作为父类,猪“哼哼叫”,狗“汪汪叫”,猫“喵喵叫”,猪、狗、猫三... 阅读详情
class A
{
 public:
     virtual void func(int val = 1){ std::cout<<"A->"<< val <<std::endl;}
     virtual void test(){ func();}
 };
 
 class B : public A
 {
 public:
     void func(int val = 0){ std::cout<<"B->"<< val <<std::endl; }
 };
 
 int main(int argc ,char* argv[])
 {
    B*p = new B;
    p->test();
     return 0;
 }

看到这段代码,你觉得程序输出结果是什么呢?大多数人可能会觉得是B->0。但其实不是,分析这段代码,创建了一个B类对象,然后调用了test()函数,由于B继承了A,所以实际上是调用了A类的test方法,这里要注意,test函数的this是A*不是B*,因为继承不是说把A类的内容拷贝到B类中,只是说B可以复用A。所以是A类指针调用func函数,又因为A和B的func函数都是虚函数,所以满足多态的条件:基类指针或引用调用虚函数。因为传的是B类对象指针p,所以这里的test的this逻辑上是A*,实际指向B类对象*p,调用的是派生类的func,但是结果并不是B->0。这是因为在多态条件下:如果调用的是子类的虚函数,那么真正的函数应该是父类的声明加子类的内容,即 

 virtual void func(int val = 1)
{
      std::cout<<"B->"<< val <<std::endl;
}

这也是为什么在子类B的func函数不加virtual也构成虚函数的原因 。

class B : public A
 {
 public:
     void func(int val = 0){ std::cout<<"B->"<< val <<std::endl; }
 };
 

什么是多态?多态在面向对象编程中有哪些应用场景? 多态是面向对象编程中的一个重要概念,它允许一个接口被多个不同的类实现,或者一个父类引用指向其子类的对象。多态的存在使得程序在运行时能够根据实际对象的类型来执行相应的操作。 阅读详情

相关推荐

C++ 多态的几种非典型场景

多态的几种情形: 在非构造函数,非析构函数的成员函数中调用虚函数,是多态; class Base { public: void func1() { func2(); } virtual void func2() { cout << "base func2" << endl; } }; class Derived : public Base { public: void func2() { // 派生类与

hui2702的专栏 698

多态的使用场景以及优点和缺点

/编译看左边的父类中有没有name这个属性,没有就报错//在实际运行的时候,把父类name属性的值打印出来//编译看左边的父类中有没有show这个方法,没有就报错//在实际运行的时候,运行的是子类中的show方法f.show();

xvjian7的博客 2862

三菱FX3U PLC红绿灯ST编程实战:从基础逻辑到急停功能完整实现

本文以十字路口红绿灯控制为例,详细讲解了三菱FX3U PLC使用ST编程的完整实战过程。内容涵盖从基础时序逻辑、状态机设计,到急停功能、黄灯闪烁、昼夜模式切换等高级功能的实现,并提供了代码优化与调试技巧,帮助工程师掌握结构化文本在工业控制中的清晰、结构化应用。

weixin_29070861的博客 533

Java——多态

多态

qq_63492484的博客 3440

AgentScope Java多智能体框架

AgentScope Java 的核心设计理念是“Agent-Oriented Programming” (面向智能体编程)。

zzz19920821的博客 1735

ARM Cortex-M系列授权解析:从研发到量产的免费与付费之路

本文深入解析了ARM Cortex-M系列内核从研发到量产过程中的授权模式。研发阶段可利用ARM DesignStart等免费资源进行原型验证,但产品商业化量产则需支付授权费与版税。文章对比了采购商用MCU与自研芯片的成本差异,并探讨了RISC-V作为免费替代方案在IoT领域的应用前景与挑战,为开发者提供了清晰的选型指南。

weixin_29292431的博客 494

java多态的应用场景_Java多态总结

写在前面由于找工作的原因,最近几个月都没有更新博客了。。。这篇可能是今年最后一篇总结类的博文了,希望能够写的好点吧 _至此,博客中java基础方面的内容零零散散地也逐渐总结完了,基本上面试经常问到的内容都涵盖了,希望大家喜欢概念介绍定义多态,是面向对象的程序设计语言最核心的特征。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。实现技术动态绑定(dy...

weixin_35816805的博客 2467

【HCIA学习记录】WLAN配置实验

HCIA-WLAN

寸先生的AI道路 3874

不知道JAVA多态哪里用过?多态的应用场景

多态是JAVA的三大特性之一,多态在JAVA中也有广泛的应用,本文简单介绍了JAVA中几种多态的应用场景供大家学习。本文简单的介绍了多态的几种应用场景,包括常用类的方法、HttpServletRequest的实现以及数据库驱动接口。接口与多态密切相关,由于接口可以有多个不同的实现类所以常常表现出多态性。...

qq_52173163的博客 4849

《Unity DOTS之ECS从入门到不香》(1)基本概念

文章目录一、什么是DOTS?二、什么是ECS?三、Hello World 一、什么是DOTS? Data Oriented Tech Stack(DOTS)是unity推出的多线程面向数据的技术堆栈 。它是一套高性能解决方案,包含三个部分: 1.ECS:ECS是一种有别于面向对象的编程模式,是面向CPU Cache友好的编程模式。要求代码都要按照 实体+组件+系统 的框架构建。官方链接 2.JobSystem:JobSystem是unity推出的一套先进的多线程任务管理系统,结合ECS可以获得最佳性能。当然

Cxihu田树东的游戏开发博客 2732

学Simulink--人形机器人控制场景实例:基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真

matlab编辑% 连杆长度 (m)% 躯干(髋到CoM)% 大腿% 小腿% 质量 (kg)% 转动惯量(绕质心,简化为杆)matlab编辑% 躯干CoM(假设在髋上方L_body/2处)% 左大腿CoM% 左小腿CoM% (右腿类似,略)本文完成了基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真,实现了:✅ 定义7-DOF平面人形结构✅ 使用Symbolic Math Toolbox自动推导动力学方程✅ 生成。

amy_mhd的博客 397

多态常见应用场景举例

package day0611; public class Test { /**多态在实际开发中的使用,以下为主人喂养宠物的例子说明多态的作用 *1.主人喂养宠物这个场景需要进行类型的抽象: *---主人【类】 宠物【类】 *--主人可以喂养宠物 所以主人有喂养这个动作 *-- 宠物【类】 *--宠物可以吃东西,所以宠物有吃东西这个动作 * *--2.面向对象编程的核心:定义好类,将类实例化为对象,给一个环境驱使一下,让各个对...

dldodo的博客 6609

Android 13.0 framework默认沉浸式导航栏功能实现

​ 在13.0的系统rom定制化开发中,在实现导航栏的某些定制化开发中,在某些产品需要实现沉浸式导航栏,就是需要app 能全屏显示同样也能显示导航栏,接下来就来分析下相关的功能实现 ​

安卓兼职framework和app工程师的博客 467

多态概念、特点及使用场景

一 : 多态 1.1 什么是多态 多态: 把子类对象伪装成父类类型 让父类类型指向子类对象 给子类对象起一个父类类型的名字 父类类型的引用=子类类型的对象 1.2 多态对象有那些特点 多态对象: 起了父类类型名字的子类对象 特点1:多态对象不能访问子类特有成员 特点2:多态对象被重新定义的属性表现的是父类中的数据 特点3:多态对象被重写的方法表现的是子类中定义的方法 总而言之:多态对象除了重写的方法 其他和父类对象完全相同 1.3 什么时候使用多态 情况1 cat类 dog类 饲养员类: we

Dear°(流沙丶念)的博客 3827

Qt/C++编写自定义控件42-开关按钮

一、前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操作,在Qt widgets应用项目上,在项目中应用些类似的开关按钮,估计也会为项目增添不少新鲜感。 总结了大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度要求比较高,但是灵活性比较好...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 3327

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

多态

面向对象的三大特征: 1. 封装 2. 继承 3. 多态 多态: 什么叫多态:一个对象具备多种形态,也可以理解为事物存在的多种体现形态(父类的引用类型变量指向了子类对象,或者是接口的引用类型变量指向了接口实现类的对象) 多态的前提:必须存在继承或者实现关系。 多态要注意的细节: 1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成...

weixin_45192252的博客 2万+

jre9下载 jdk9

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

多态真的有用吗?使用在哪些场景?

多态真的有用吗?今天番茄加速就来说一说。 如果说OOP的封装和继承使用起来更加直观易用,那么作为第三大特性的多态,在实践中真正运用起来就不那么容易。有的读者OOP编程初期,可能对多态的价值体会不深刻,甚至都已经淡忘它的存在。 那么问题就在:多态到底真的有用吗?到底使用在哪些场景? 多态价值很大,使用场景很多,几乎所有的系统或软件,都能看到它的应用。这篇文章尽可能通过一个精简的例子说明它的价值和使用方法。如果不用多态,方法怎么写;使用多态,又是怎么写。 为了一脉相承,做到一致性,仍然基于上面的案例,已经创建好

wangyiniya的博客 1650

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C++】多态 ③ ( “ 多态 “ 实现需要满足的三个条件 | “ 多态 “ 的应用场景 | “ 多态 “ 的思想 | “ 多态 “ 代码示例 )

一、" 多态 " 实现条件 1、" 多态 " 实现需要满足的三个条件 2、" 多态 " 的应用场景 3、" 多态 " 的思想 二、" 多态 " 代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2947

C++多态

C++中的多态分为静态多态和动态多态两种,其中: 静态多态在编译阶段实现,其原理是由函数重载实现,通过不同的实参调用其相应的同名函数。 动态多态通过虚函数实现,以下着重介绍 动态多态的两个必要条件: 必须通过基类的指针或者引用调用 被调用的必须是虚函数,且在派生类中实现了该虚函数的重写 以下解释何为通过基类的指针或者引用调用 int main() { Person p; student s; Person &tmp1 = p; Person &tmp2 = s;//tm

weixin_50569901的博客 1万+

函数重载之多态场景

摘要: 文章探讨了C++中父类指针与子类指针作为函数参数时的重载问题。

优快云_RTKLIB的博客 566

python 多态应用_类的多态的理解和应用场景

课上的理解用例子说明:class People(object): # 先定义一个基类def talk(self): # 基类的talk方法,我们不希望被调用,写一个会抛出错误的代码"如果基类的这个方法被调用,就抛出一个错误"raise NotImplementedError("Subclass must implement abstract method")class Chinese(Peop...

weixin_39550486的博客 402

【C++】多态

本文主要讲述C++中的多态,涉及的概念有虚函数、协变、纯虚函数、抽象类、虚表指针和虚函数表等。首先是继承。多态是一个继承关系的下的类对象,去调用同一函数,产生了不同的行为。

x_p96484685433的博客 1243

参数多态、包含多态、过载多态和强制多态

多态分为两种:通用的多态和特定的多态。两者的区别是前者对工作的类型不加限制,允许对不同类型的值执行相同的代码;后者只对有限数量的类型有效,而且对不同类型的值可能要执行不同的代码。     通用多态又分为参数多态(parametric)和包含多态(Inclusion Polymorphism);特定多态分为过载多态(overloading)和强制多态(coercion)。     强制多态(

飞老虎 1万+

Dagger2对Java多态场景的处理

日常开发过程中,总会遇到一个接口拥有多个子类,同时都需要进行实例化并完成自动依赖注入过程,有些DI框架针对这种场景的问题是通过ByName的方式处理的,也就是说,给实例化后的子类实例一个别名,实际使用过程中通过自动注入到引用别名的地方来使用的。 在Dagger2中也就类似的功能来支撑这种业务场景的对象实例自动依赖注入,接下来,我们将简要说明多态场景下Dagger2的使用。 4.1 Dagger2对简单多态场景的处理 首先定义一个MyBusinessInterface接口,此接口将被多个子类继承:

甘谷天蚕网络技术有限公司 2815

多态性之编译期多态和运行期多态(C++版)

编译期多态和运行期多态(C++版)     C++中最为经典的就是多态性,多态性充分体现了面向对象的思想,并且是C++与C的最大区别之一。多态性分为编译期多态和运行期多态,也称为静态多态和动态多态,有些人也称其为编译时多态和运行时多态,不管什么称呼,万变不离其宗,一个是编译期的静态的多态,一个是运行期的动态的多态,那么它们在C++中分别体现在哪里呢?又有什么区别呢?下面将详细介绍(重点是

君临天下的博客 7244
上一篇: AVLTree
下一篇: C++父类子类指针与多态的一些问题
bugu___
博客等级 码龄2年 63粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值