多态(polymorphism),覆盖(Override),重载(overload)

多态&重载、隐藏(重定义)、重写(覆盖) 多态: 多态按字面的意思就是多种形态,相同的方法调用,但是有不同的实现方式。多态性可以简单地概括为“一个接口,多种方法”。C++有两种多态形式: 静态多态 动态多态 静态多态(静态绑定):也称为编译期间的多态,编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。 静态多态有两种实现方式: 函数重载:包括普通函数的重载和成员函数的重载 函数模板的使用 动态多态(动态绑定):即运行时的多态,在程序执 阅读详情

多态(polymorphism)
覆盖(Override)
重载(overload)
也有把override译为重载的。
关于override和overload的翻译,好像不是很统一。
更多的应该是:
覆盖(override)和重载(overload)

1
。

覆盖 override:

Overriding
也许叫做overwriting更合适,
OVERLOAD
覆盖是指在子类(c++中的派生类) 中重新定义父类的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本。
比如

代码:

#ruby code
class Base
    def m1
       puts "in base"
    end
end

class Sub < Base
    def m1
       puts "in sub"
    end
   
end


我们说Sub类覆盖了父类的m1方法

2
。
重载(overload):
在同一个类中,出现多个同名的方法的现象就是Overload
重载事发生在同一个类中,不同方法之间的现象。

在c++或者java中,方法一般为
返回类型 方法名(参数1,参数2)
判断2个方法是不是overload,主要指方法名一样,参数不一样,
参数不一样指的是参数的个数,相同位置的参数的类型是否一样,而与参数(型参)的名称无关(参数类型/个数/顺序,不同),
与返回类型也无关。程序会根据不同的参数列来确定需要调用的函数
比如c++或者java中,这都是overload
void m1();
void m1(int arg);
void m1(int arg, char* x);

在ruby中,不存在这样的overload

代码:

#ruby code
def method_a(a)
     puts "method_a(a) "+a.to_s
end

def method_a(a,b)
     puts "method_a(a,b) "+a.to_s+" "+b.to_s
end

method_a("a") #这句会出错,因为这个方法的定义已经被method_a(a,b)重定义给覆盖了

method_a("a","b")

 

 



method_a("a")
这句会出错,因为这个方法的定义已经被method_a(a,b)重定义给覆盖了
因为ruby的弱类型和可变参数列表,使得overload不是很明显。


3
。
多态(polymorphism)
至于多态,我还没有见过一个看一眼就能明白的定义。
有的说是允许将子类类型的指针赋值给父类类型的指针,当然java中没有指针的概念。
多态有时候也被称为动态绑定或者晚绑定或运行时绑定,意思是编译的时候不必关心,运行的时候才决定调用哪个对象的哪个方法。
我觉得多态的用途之一就是在父类提供一个接口(服务),然后调用的时候用的却是子类的具体实现。这个结合java中的interface应该是比较形象的,但是我懒得再去写几个例子了。
先来看一个java中不用interface的例子:

代码:

//java code
public class Base{

    void m1(){
        System.out.println("in base,m1");
    }

    void m2(){
        System.out.println("in base,m2");
    }

    public static void main(String[] argv){
        Base b=new Sub();
        b.m1();
        b.m2();   
   
    }
}

class Sub extends Base {
    void m1(){
        System.out.println("in sub,m1");
    }   

}


在main方法中b声明为Base类型,而实例化的时候是一个Sub类的实例,Sub中没有实现m2方法,所以,将调用Base的m2方法,而Sub overwirte了父类的m1方法,所以,b.m2()将调用Sub类的m1方法。

在c++中可能负杂点:

代码:

//c++ code
#include <iostream.h>

class Base{
public:
    void m1(){
       cout<<"i am in base /n";
    }
    virtual  void m2(){
       cout<<"i am in base ,virtual  /n";
    }       
};

class Sub:public Base{
public:
    void m1(){
       cout<<"i am in sub /n";
    }       
    virtual  void m2(){
       cout<<"i am in sub ,virtual  /n";
    }     
};
 
void fnm1(Base&  b ){
     b.m1();   
}
void fnm2(Base&  b ){
     b.m2();   
}



int main(void)
{

  Sub s;
  s.m1();
  s.m2();
  Base b;
  b.m1();
  b.m2();
  Base* bs=new Sub();
  bs->m1();
  bs->m2();
  delete bs;
 
  Sub s;
  fnm1(s);
  fnm2(s);
  return(0);
}


在c++中,需要virtual关键字(当然Sub::m2()的virtual是可以省略的)
运行结果如下:

代码:

i am in sub
i am in sub ,virtual
i am in base
i am in base ,virtual
i am in base
i am in sub ,virtual
i am in base
i am in sub ,virtual



fnm2(Base& b )
中,b是一个Sub类型,如果这个方法是virtual的,则调用Sub的m2,否则,调用Base的m2。
而Ruby的弱类型性,也不怎么存在这个问题。

代码:

#ruby code

class Base

def m1

puts "in base"

end

end

 

class Sub < Base

def m1

puts "in sub"

end

 

end

 

def fn(a)

a.m1

end

 

a=Sub.new

fn(a)

b=Base.new

fn(b)

 


总之,多态性是面向对象的基本特性,而overload应该不算是面向对象的特性吧。

视觉SLAM的前段后端最详细的梳理(硕士入门知识框架更新) 文章目录视觉SLAM的组成结构视觉里程计(VO)-特征点法 -构建稀疏点云地图-直接法 -构建稠密或半稠密的地图 --需要使用 RGB-D 传感器视觉里程计--总结:SLAM 后端研究滤波器法非线性优化后端方式的差异(有五种优化方式):单目视觉里程计的初始化:运动估计:半直接法运动估计的优化方案:关于解决累计误差的一些方法:关键帧的建图及后端优化:特征的深度估计:图优化的后端研究:视觉与IMU融合的分类:视觉与IMU的融合的优势:存在的问题:优秀的开源: 视觉SLAM的组成结构 视觉里程计(VO) -特 阅读详情

相关推荐

TMC2209串口配置实战:从寄存器解析到电机精准控制

本文详细解析TMC2209步进电机驱动芯片的串口配置方法,从硬件连接到UART通信协议,再到核心寄存器功能详解。通过实战案例展示电流控制、微步细分和速度调节等关键配置,帮助工程师实现电机精准控制,并提供了常见故障诊断和优化技巧。

f6g7h8i9j的博客 1173

重载与覆盖的区别

重载与覆盖的区别1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。3、覆盖要求参数列表相同;重载要求参数列表不同。4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。override

Tech is Online(物联网技术传播) 1万+

自动驾驶仿真(六)—— SIL软件在环仿真测试

自动驾驶仿真六—— SIL软件在环仿真测试1. 在环仿真测试2. SIL软件在环仿真测试2.1 模型配置参数2.2 S function生成实现2.3 结果对比3. 参考学习的书目教材 博主前面的博文已经简要介绍了Carsim、Prescan 与 Simulink 在 “V”型开发流程的一些应用,现今成熟的汽车控制系统软件都是以(Model Based Design,MBD)来开发,它以图形化的方式表达复杂的逻辑、代码可读性、可移植性、开发调试便利程度都大大增强,同时利用成熟的代码生成工具链,也避免了手工代

zhudj08的博客 8649

多态、重载、覆盖

一、多态   面向对象的设计原则中有一条里氏代换原则:父类出现的地方,子类一定可以出现,反之则不一定;多态即是这一原则的具体表现形式,设有父类为A,含有方法g(),B1、B2、……、Bn是A类的子类,每个子类都以自己的方式实现了方法g(),当类A的对象向子类对象发出消息g()时,接收到此消息的各B子类对象将表现出不同的行为,这种现象即为多态。   多态性是允许你将父对象设置成为和一个或更多的他...

mystonelxj的博客 1万+

使用Anaconda和conda快速搭建YOLO开发环境

本文详细介绍了如何使用Anaconda和conda为YOLO目标检测项目快速搭建独立、纯净的开发环境。通过创建虚拟环境,有效解决了Python包版本冲突和CUDA兼容性问题,并指导安装GPU版PyTorch等核心依赖,最后通过验证脚本确保环境配置成功,为YOLO开发提供了稳定可靠的基础。

weixin_28829629的博客 161

OpenClaw实战系列01:OpenClaw接入飞书机器人全接入指南 + Ollama本地大模型

通过 OpenClaw + Ollama + 飞书的组合,我们成功搭建了一个完全私有、免费、可定制的AI助理。它不仅能在日常聊天中提供帮助,还能通过OpenClaw强大的“技能”体系,真正去操作你的电脑、管理文件、甚至执行代码。这套方案将数据留在本地,既保证了隐私安全,又锻炼了动手能力。现在,去给你的AI助理添加更多酷炫的技能吧!

PeterPan的博客 1万+

什么是类和对象?看完这篇就知道

类和对象 文章目录类和对象前言一、什么是类和对象二、使用步骤1.引入库2.读入数据总结 前言 Java是一门面向对象的编程技术,在Java中我们常说一切皆对象,那么接下来我们就来看看什么是类和对象 一、什么是类和对象 什么是对象? 在生活中,像张三,李四,王五,这样真真正正存在人的实体,我们称这些实体为对象。 什么是类? 我们在描述这些对象的时候,发现这些对象具有一些共同的特征,这些特征分为两种: 1.具有相同的属性:这些对象都有鼻子,眼睛,嘴巴等等 2.具备相同的行为:这些对象都要吃喝拉撒睡

weixin_57011679的博客 1万+

HITECH海泰克触摸屏如何使用串口进行程序的下载和上传(拨码设置)以及离散量报警相关设定?

HITECH海泰克触摸屏如何使用串口进行程序的下载和上传(拨码设置)以及离散量报警相关设定? 首先,我们进行触摸屏一侧的设置,如下图所示: 触摸屏背后有拨码开关,当我们需要上传或下载程序时,需要将7#开关拨到上面; 左侧是DC24V电源接口; 下方是COM1、COM2和COM3通信端口,选择我们需要的端口后,插上通信电缆,拔掉24V电源,然后重新上电; 然后,屏幕会进入如下图所示界面,此时显示当前选择的端口为COM2,我们点击F2“config”,进入设置界面, 可以看到COM2端口是“Enabled”

Robot_PLC_HMI_Automation 3万+

覆盖、多态、重载

覆盖 override是重写了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写父类的方法。 重写的规则: 1.重写方法的参数列表必须完全与被重写的方法相同,否则不能称为重写而是重载。 2.重写方法的访问修饰符一定要大于被重写方法的访问修饰符。 3.重写的方法的返回值必须和被重写的方法返回一致。 4.重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是子类。 5.被重写的方法...

qq_43598865的博客 309

从数字后端角度谈谈occ电路(二)

从图中,我们可以清晰的看出,当scan_en为1时,test mode为1时,经过一系列逻辑单元后,得到clk_sel输出信号为1,同样可推算fast_clk_en = 0,slow_clk_en为1,此时clk_out输出为slow clk,符合我们预期。在该模式下,是使用slow clock进行scan shift,接着我们开始进行推导;从图中,我们根据逻辑运算可以看出,clk_sel输出信号为0,fast clk en为1,此时通过mux选择,clk out即为fast clk;

芯冰乐 357

[QMT量化交易小白入门]-九、如何用Python记录每一笔交易和调试,报错信息?

定义一个函数来获取日志记录器。: 返回全局的日志记录器,以便在其他地方调用。

木头大左的博客 2143

override->重写(=覆盖)、overload->重载、polymorphism -> 多态

override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。 重写(覆盖)的规则:    1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.    2、重写方法的访问修饰符一定要大于或等于被重写方法的访问修饰符(public>protected>default>private)。    3、重写的方法的

u012411037的专栏 309

从零开始创建Davinci Configurator配置工程

本文介绍了从零开始搭建达芬奇工程的详细步骤。首先安装Vector的CBD包后,通过DavicCFG.exe新建空白ECU工程。文章提到Postbuild相关概念可参考往期文章《AUTOSAR配置中的PostBuild、Precompile、Linktime》,并预告下期将讲解如何通过导入DBC文件来启用AUTOSAR模块。全文以实操截图为主,步骤清晰简明,适合开发者参考备份。

Xiaowestwind的博客 218

java 继承 多态(override->重写(=覆盖)、overload->重载、polymorphism -> 多态)

. package edu.javase.buffer;class demo1 { public demo1() { System.out.println("fun1 constend"); } public demo1(int i) { System.out.println("fun1 int i constend:" + i); }...

weixin_30692143的博客 107

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

C++重写(覆盖)、重载、重定义、多态

1 重写(覆盖)override   override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。 重写需要注意: 被重写的函数不能是static的,必须是virtual的 重写函数必须有相同的类型,名称和参数列表 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为pu...

mw_nice的博客 239

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++ 覆盖、重载和多态的概念

  覆盖 (override):Override覆盖是指在子类(c++中的派生类) 中重新定义父类的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本。  重载(overload): 在同一个类中,出现多个同名

litove的专栏 1592

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[C++基础]重载、覆盖、多态与函数隐藏(1)

重载、覆盖、多态与函数隐藏   经常看到C++的一些初学者对于重载、覆盖、多态与函数隐藏的模糊理解。在这里写一点自己的见解,希望能够C++初学者解惑。   要弄清楚重载、覆盖、多态与函数隐藏之间的复杂且微妙关系之前,我们首先要来回顾一下重载覆盖等基本概念。   首先,我们来看一个非常简单的例子,理解一下什么叫函数隐藏hide。 #include using namespace s

ARLoverKang的专栏 996

重写、覆盖、重载、多态几个概念的区别分析

override->重写(=覆盖)、overload->重载、polymorphism -> 多态 override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。重写(覆盖)的规则: 1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2、重写方法的访问修饰符一...

alnh4952的博客 71

重写(override),重载(overload),多态(polymorphism)

表面看起来似乎很容易混淆,其实区别很大,主要是使用场景不同。 1.重写,一般是用于子类在继承父类时。 父类和子类,只是函数内部的实现不一样,其他都必须一样。 2.重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。 最常见的例子,就是一个类有多个构造方法。再比如,一个形状类,其getSides方法根据具体形状比如三角,矩形而具有不同的输入输出参数。和其他类无关,

个人开发之路 789

重写、覆盖、重载区别和存在的意义

override->重写(=覆盖)、overload->重载、polymorphism -> 多态 override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。 重写(覆盖)的规则: 1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(publ

XuJiangDong 1万+

多态(Polymorphism)

Polymorphic method invocations apply only to instance methods. You can always refer to an object with a more general reference variable type (a superclass or interface), but at runtime, the ONLY thi

songuo' s home 730
上一篇: RubyGems简介
下一篇: 最近一直没有更新
ruby_cn
博客等级 码龄22年 23粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值