C++的重写,重载,重定义

详解C++中重载(Overload)、重写(Override,也称覆盖)和重定义(Redefine,也称隐藏)的区别 本文系统解析了C++中重载(Overload)、重写(Override)和重定义(Redefine)的核心区别。重载发生在同一作用域内,要求函数名相同但签名不同;重写是派生类对基类虚函数的重新实现,实现运行时多态;重定义则是派生类定义与基类同名函数导致基类版本被隐藏。三者在作用域、函数签名要求、多态类型和调用规则等方面存在显著差异,理解这些差异对编写高效的面向对象程序至关重要。 阅读详情

1. 重写/覆盖 (override):

      父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。

1) 被重写的函数不能是 static 的。必须是 virtual 的,或者是 override 的 ( 即函数在最原始的基类中被声明为 virtual , c++ 中没有 override) 。

2) 重写函数必须有相同的类型,名称和参数列表 (即相同的函数原型)

3) 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的 ( 这点与 C# 完全不同 )

2. 重载 (overload):

      指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。

 

3. 重定义 (redefining):

      子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。

      重定义后子类调用的函数是子类自己的函数,父类的函数会被隐藏。名字隐藏特性。如果想调用父类的该同名函数,需要用父类加上作用域来指定调用的函数。

 

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

 

class Base {

   private:

      virtual void display() { cout<<"Base display()"<<endl; }

      void say(){ cout<<"Base say()"<<endl; }

   public:

      void exec(){ display(); say(); }

      void f1(string a) { cout<<"Base f1(string)"<<endl; }

      void f1(int a) { cout<<"Base f1(int)"<<endl; }   //overload

};

 

class DeriveA:public Base{

   public:

      void display() { cout<<"DeriveA display()"<<endl; }   //override

      void f1(int a,int b) { cout<<"DeriveA f1(int,int)"<<endl; }   //redefining

      void say() { cout<<"DeriveA say()"<<endl; }   //redefining

};

 

class DeriveB:public Base

{

   public:

      void f1(int a) { cout<<"DeriveB f1(int)"<<endl; } //redefining

};

 

int main(){

   DeriveA a;

   Base *b=&a;

   b->exec();        //display():version of DeriveA call(polymorphism)                          

                         //say():version of Base called(allways )

   a.exec();        //same result as last statement

   a.say();

   //a.f1(1);         //error:no matching function, hidden !!

   DeriveB c;

   c.f1(1);         //version of DeriveB called

}

注意:在 C++ 中若基类中有一个函数名被重载,在子类中重定义该函数,则基类的所有 版本将被隐藏——即子类只能用子类定义的,基类的不再可用。——名字隐藏特性。

C++ override使用详解 C++ override从字面意思上,是覆盖的意思,实际上在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用。在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。还有一个典型应用就是在继承中也可能会在子类覆盖父类的方法。       公有继承包含两部分:一是“接口”(interface),二是 "实现" 阅读详情

相关推荐

Profinet从站开发初体验:用p-net开源库和树莓派快速搭建一个IO设备模拟器

本文详细介绍了如何使用p-net开源库和树莓派快速搭建Profinet从站IO设备模拟器。从开发环境准备、p-net源码编译到设备模拟器功能实现,提供了全流程实战指南,帮助开发者快速掌握工业通信协议开发技巧,适用于工业自动化领域的设备互联测试与验证。

weixin_30384217的博客 383

C++学习:重载,重写和覆盖

C++学习:重载,重写和重定义重写(覆盖) override重载 overload重定义redefining多态 重写(覆盖) override override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。 重写需要注意: 被重写的函数不能是static的,必须是virtual的 重写函数必须有相同的类型,名称和...

qq_34672406的博客 941

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6685

C++ 函数重写

前言: 今天遇到一个问题,C++的问题,函数重写。自从上学的时候学过C++重写的定义,以及做过点题就再也没有思考过这个问题。 结果今天再项目中就遇到了这个问题,一个模块的子类需要重写父类的函数,然后执行完子类的函数再执行一遍父类的函数。这个问题问我们领导,领导只告诉我怎么做,具体为什么没说,而后我自己写了个demo自己琢磨了一下,把自己琢磨出的东西记录下来,对不对不知道,就是自己瞎琢磨出来的。 定义: C++的函数重写的定义其实就是父类有一个函数A,子类继承了父类的A函数,看A函数不顺眼,自己重新实

m0_38036750的博客 9126

Vivado DDR IP自定义型号避坑指南:如何正确填写CSV参数表(附常见错误排查)

本文详细解析了Vivado DDR IP自定义型号配置中的关键步骤与常见问题,特别针对DDR4内存颗粒的参数提取、CSV参数表填写误区及故障排查提供了实用指南。通过实际案例和调试技巧,帮助工程师避免配置陷阱,提升DDR4系统稳定性和性能。

weixin_29280657的博客 414

手把手教你用SNAP做全极化SAR图像分类

引言 最近在研究极化SAR图像分类方面的内容,发现用SNAP软件可以很方便的实现图像的分类。因为在入门过程中踩了很多坑,浪费了一些时间,为了不让大家踩坑,所以决定写下这篇教程。 前期准备 软件下载 SNAP是欧空局旗下的一个SAR图像处理软件,可以点击下载地址进行下载。 数据下载 数据下载地址:https://mdacorporation.com/sample_data/RS2_OK76385_...

zz651044657的博客 1万+

C++中重写(override)和重载(overload)

在C++中,重写(override)和重载(overload)是两个不同的概念。 重写用于在派生类中修改虚函数的实现,以便满足派生类的特定需求。而重载用于在同一作用域内定义具有不同参数列表的多个函数。

cnds123的专栏 4436

深入解析BLheli电调固件与Dshot通讯协议:从原理到实践

本文深入解析了无人机动力系统的核心——BLheli电调固件与Dshot通讯协议。详细阐述了BLheli固件从经典版到BLheli_32的演进及其功能特性,并重点剖析了Dshot数字协议如何通过数据包和校验码实现更快、更准、更可靠的电机控制。文章还涵盖了双向Dshot遥测、实战配置与调参指南,帮助玩家充分释放无人机性能。

weixin_28273593的博客 436

C++ 之函数重写

派生类中的函数重写: 派生类可以通过重新定义基类中的虚函数来实现函数重写。在派生类中,函数的声明和定义需要与基类中的虚函数一致,包括函数签名和返回类型。在C++中,函数重写(Function Overriding)是一种面向对象编程的概念,它允许派生类重新定义基类中已经定义的虚函数。函数重写用于实现多态性,使得程序能够在运行时选择调用哪个版本的函数,以便适应不同的对象类型。运行时多态性: 使用基类指针或引用指向派生类对象,并调用虚函数时,将会根据对象的实际类型调用相应的函数。请注意,只有虚函数才能被重写。

qq_42244167的博客 1842

微信PC端Multi文件夹数据库解析:语音消息导出与转换实战指南

本文提供了一份详细的微信PC端语音消息导出与转换实战指南。通过解析Multi文件夹中的MediaMSG数据库,指导用户定位、解密数据库,并利用Python脚本精准提取SILK格式语音,最终转换为通用的WAV或MP3格式,实现个人语音数据的本地备份与处理。

garlic的博客 583

PCL DBSCAN密度聚类【2026最新版】

点云密度聚类的PCL代码实现,与matlab自带的密度聚类算法进行对比验证,结果一致。3万多个点能再2秒左右运行出结果,算法效率尚可。

点云侠的博客 5682

菜鸟学C++ (分清楚C++中重载、重写和重定义)

1、背景 在C++里有必要弄清楚他们三者的不同。 1.1 参考资料 https://www.cnblogs.com/weizhixiang/articles/5760286.html 2、三者的不同详细 重载(overload):是函数名相同,参数列表不同,override只是在类的内部存在。 重写(override),也叫覆盖。子类重新定义父类中有相同名称和参数的虚函数(virtua...

zhejfl的博客 2万+

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

Robot_PLC_HMI_Automation 8585

C++:重载,重定义,重写的区别

这是比较容易混淆的概念,在此整理,以便理解。 一:重载 重载指的是在同一个作用域内,两函数的函数名可以相同,但是参数不能完全相同,可以是参数类型不同或者是参数个数不同,至于返回值,不影响重载。 如图,构成了重载: 如何实现重载? C++代码在编译时会根据参数列表对函数进行重命名,例如void Test(int a, int b)会被重命名为_Test_int_int,void Tes...

来信 2万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【C++】重载、重写、重定义的辨析

重载、重写、重定义对比 一、重载(overload) 二、重写 / 覆盖(override) 三、重定义 / 隐藏(redefining) 为什么在虚函数中不能使用 static 关键字? 重写函数的访问修饰符可以不同吗?

m0_74195626的博客 2001

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++中重定义,重载,重写

C++中的重定义指在同一作用域内定义了同名的函数、变量或类型。重定义是编译器无法处理的语法错误,将导致程序无法编译通过。例如,在同一作用域内定义了两个函数名相同、参数列表相同的函数,就会产生重定义错误。C++中的重定义指在同一作用域内定义了同名的函数、变量或类型。重定义是编译器无法处理的语法错误,将导致程序无法编译通过。例如,在同一作用域内定义了两个函数名相同、参数列表相同的函数,就会产生重定义错误。如下是一个示例:```int add(int x, int y) { // 重定义。

weixin_46326585的博客 1978

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++函数重载、重写与重定义

C++函数重载、重写与重定义

-笔记- 4400

C++:重载、重写、重定义

C++ 重载、重写和重定义 重载:函数名相同,函数的参数个数、参数类型或参数顺序三者中必须至少有一种不同。函数返回值的类型可以相同,也可以不相同。发生在一个类内部。 重写:即覆盖,一般发生在子类和父类继承关系之间。子类重新定义父类中有相同名称和参数的虚函数。 重定义:即隐藏,子类重新定义父类中有相同名称的非虚函数( 参数相同 ) 虚/非虚函数(参数不同),派生类的函数屏蔽了与...

free377096858的博客 1523

C++函数重载、函数重定义、以及函数重写

在C++的学习中,肯定免不了对一些概念的辨析,但往往很多时候,百思不得其解。问题的关键在于自己是否注意到了一些细节。 一、函数重载(overload) 函数重载是什么? 其实,我们大可以认为这是编译器的一种机制,他会根据函数的相关特性来自动对你所调用的函数进行匹配,自动选择匹配的函数,从而这种自动匹配选择从而调用对应的函数的机制,我们就可以称为函数重载。 怎么样能构成函数重载? 函数重载是指在一个类中声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序,类型不同,但是不能靠返回类型来判断。特征是:

qq_1628941121的博客 5645

C++ -- 重载、重定义、重写的区别

一.重载1.在同一个作用域下,函数名相同,函数的参数不同(参数不同指参数的类型或参数的个数不相同)2.不能根据返回值判断两个函数是否构成重载。3.当函数构成重载后,调用该函数时,编译器会根据函数的参数选择合适的函数进行调用。4.构成重载的例子:#include&lt;iostream&gt;using namespace std;int Add(int a, int b){      return...

我的博客 1万+

C++ 重载、重写、重定义的区别

本文是学习重载、重写、重定义的学习笔记。 重载(overload):类中同名函数,通过参数不同,实现不同的功,返回值不同不能作为重载区别。 重写(override):子类重写父类的虚函数,父类函数必须是virtual说明的,不能是static的,是C++实现多态的方式,让父类能调用子类的方法。 重定义(redefining):子类重定义父类的同名非虚函数,参数可以同父类不同。一旦重定义,父类的同名...

anjiayin的博客 687

c++函数重载、重写、重定义区别与联系及协变

1.函数重载: 在C++种,函数重载是在同一作用域,函数名相同,但是参数列表:参数个数,参数类型,返回值(可同可不同)不同。总之,只要在同一作用域,只要函数名相同,就可构成函数重载。对于函数重载可查看这篇博客:https://mp.youkuaiyun.com/postedit/80551981 2.重定义(隐藏) 在基类和派生类中有同名成员,成员可以是变量,也可以是函数,如果是函数,不管参数或是返回值是否相...

sophia__yu的博客 3220

c++中,重载,重定义,重写 的区别

一:重载 在一个类中,函数名相同,参数列表不同(具体表现为参数个数或参数类型不同),至于返回型可同可不同。重载属于静态多态,而不是通过继承和虚函数实现的动态多态。编译器会根据这些函数的参数列表的不同,将同名的函数名称做修饰,从而生成不同名称的预处理函数。 eg: double  max(double x,double y), int  max(int  x,int y); 这两个函数就是...

leikun153的博客 3705

C++重写和重定义和重载

概念重定义通常也叫隐藏,是指在派生类中重新定义了与基类中同名的非虚函数(普通函数),或者改变了基类中同名函数(无论是否虚函数)的参数列表等情况,使得派生类中的同名函数将基类中的同名函数隐藏了起来。这并非是为了实现多态,而是在派生类中重新定义了一个和基类有同名情况的函数而已。规则及特点只要同名就可能隐藏:只要派生类中有和基类同名的函数(无论参数是否相同),就会发生隐藏现象。如果想在派生类中访问被隐藏的基类同名函数,可以通过使用基类名加作用域限定符()来访问,例如。参数不同也隐藏。

Visual_progress的博客 2754

C++:函数重载、重定义与重写

函数重载 在同一个作用域中,两个函数的函数名相同,参数个数,参数类型,参数顺序至少有一个不同,函数返回值的类型可以相同,也可以不相同。 C++中支持函数重载是因为C++中会对函数进行名字修饰。Name Mangling是一种在编译过程中,将函数、变量的名称重新改编的机制,简单来说就是编译器为了区分各个函数,将函数通过某种算法,重新修饰为一个全局唯一的名称。 C语言只是简单的在函数名前添加下划线。因...

ETalien_的博客 950

初识C++之函数重载、重写、重定义的区别

在C++的学习中,慢慢接触了一些很容易混淆的名词,今天就来剖析几个容易混淆的名词。 1、函数重载   重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。想要构成重载函数必须要满

ljx_5489464的博客 4042
上一篇: C++模板学习
下一篇: 用openssl编写ssl,tls程序实例
lixingworkCCC
博客等级 码龄15年 24粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值