c++ 多态、覆盖、重载的综述

OpenVox 8FXO板卡驱动安装记录 OpenVox A800P和A1200P的板卡驱动安装及问题解决方法 阅读详情

转自:点击打开链接,代码部分做部分修改;


1、多态: 

在基类中定义了一个虚拟函数,然后在派生类中又定义一个同名,同参数表的函数,这就是多态。多态是这3种情况中唯一采用动态绑定技术的一种情况。也就是说,通过一个基类指针来操作对象,如果对象是基类对象,就会调用基类中的那个函数,如果对象实际是派生类对象,就会调用派声类中的那个函数,调用哪个函数并不由函数的参数表决定,而是由函数的实际类型决定。

一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态。

c++使用滞后捆绑技术支持多态,这种技术通过预先设定其成员函数的虚函数性质,使得任何捆绑该成员函数的未定类型的对象操作在编译时,都以一个不确定的指针特殊的“引命待发”来编码,到了运行时,遇到确定类型的对象,才突然指定其真正的行为。即滞后到运行时根据具体类型的对象来捆绑成员函数。这样一来,辨别对象类型的工作就可以不用用户做了。

如果一种语言虽然支持继承,但不支持多态,则不能称为支持面向对象编程。

//poly.cpp

#include <iostream>
using namespace std;
class A
{
public:
   virtual void ShowMessage();
};

class B:public A
{
public:
  void ShowMessage();
};

void A::ShowMessage()
{
  cout<<"This is A./n";
  return;
}

void B::ShowMessage()
{
  cout<<"This is B./n";
  return;
}

int main()
{
  A* p = NULL;
  p=new A();
  p->ShowMessage();
  p=new B();
  p->ShowMessage();
  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

输出为:

This is A.
This is B.
  • 1
  • 2

2、覆盖: 
在基类中定义了一个非虚拟函数,然后在派生类中又定义了一个同名同参数同返回类型的函数,这就是覆盖了。 
覆盖函数往往先调用祖先类中的被覆盖函数,之后再添加自身的特殊操作。 
在派生类对象上直接调用这个函数名,只会调用派生类中的那个。 

//coverage.cpp

#include <iostream>
using namespace std; 
class A
{
public:
  void ShowMessage();
};
class B:public A
{
public:
  void ShowMessage();
};

void A::ShowMessage()
{
  cout<<"Hello,This is A./n";
  return;
}

void B::ShowMessage()
{
  cout<<"Hello,This is B./n";
  return;
}

int main()
{
  A* p = NULL;
  B memb;
 *p = memb;
  p->ShowMessage();
  memb.ShowMessage();
  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

输出为:

Hello,This is A.
Hello,This is B.
  • 1
  • 2

3、重载: 
有两个或多个函数名相同的函数,但是函数的形参列表不同。在调用相同函数名的函数时,根据形参列表确定到底该调用哪一个函数。

//reload

#include <iostream>
using namespace std;
class A
{
public:
  void ShowMessage();
  void ShowMessage(string str);
};
void A::ShowMessage()
{
cout<<"Hi,This is A./n";
  return;
}

void A::ShowMessage(string str)
{
  cout<<str<<endl;
  return;
}

int main()
{
  A mem;
  mem.ShowMessage();
  mem.ShowMessage("Hello.How are you?/n");
  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

输出为:

Hi,This is A.
Hello.How are you?
TWINCAT3保姆级教程:手把手教你给Ecat从站烧录EEPROM(含XML配置避坑指南) 本文提供TWINCAT3环境下Ecat从站EEPROM烧录的完整教程,涵盖XML配置避坑指南。详细讲解环境准备、设备扫描、XML文件配置、EEPROM烧录流程及故障排查,帮助工程师高效解决设备识别问题,提升产线调试效率。 阅读详情

相关推荐

离线路径规划服务Graphhopper

离线路径规划服务Graphhopper 本文主要探索使用Graphhopper搭建离线路径规划服务,需要掌握一定的JAVA基础环境配置的知识 文章目录离线路径规划服务Graphhopper前言一、Graphhopper是什么?二、使用步骤1.下载Graphhopper2.从OpenStreetMap下载路图数据3.安装Graphhopper所需环境4.修改配置5.启动Graphhopper总结 前言 在外网环境中可以使用百度、高德等第三方的sdk用以实现路径规划的功能,由于项目的需要,在离线环境中需要使

Sysdark的博客 7557

对于c++多态的总结:重载(函数、运算符)、隐藏(屏蔽) 及 覆盖(重写)

重载 函数重载: 能使用多个同名的函数,即允许函数有多种形式。 重载的关键是函数的形参列表—也称为函数特征标(function signature)。如果两个函数的参数数目,参数类型,参数的排列顺序都相同,则他们的特征标相同。C++允许定义同名的函数前提是他们的特征标不同,只要上述特征标有一个不同则函数可重名。 例如:函数重载举例P227上 编译器将根据所采取的用法即函数实参的类型,数目,顺序来匹配相应的函数。使用被重载函数时必须使用目标函数...

weixin_60634144的博客 1583

电力现货交易市场-报价方式

电是一种能源,也是一种商品,既然是商品自然可以在市场中进行自由交易。

qq_38225433的博客 5117

C++中的覆盖(重写)、重载、隐藏(重定义)、多态!

C++中的覆盖(重写)、重载、隐藏、多态!

魏波 2386

2026年9月20日 2026年CSP-S初赛真题整理

这是本次考试最难的部分,涉及Gray Code(格雷码)+ 状态压缩 + 数学推导难点解决方案关键代码问题转化将得分差转化为m−2xim - 2x[i]m−2xi高效枚举Gray Code相邻状态O(1)转移奇偶判断利用奇偶性统一条件。

weixin_51184047的博客 619

Saturn PCB Toolkit V8.02 实战:5分钟完成10A电源路径的走线与过孔通流验证

本文详细介绍了如何使用Saturn PCB Toolkit V8.02快速验证10A电源路径的走线与过孔通流能力。通过实战案例和参数配置指南,帮助工程师解决大电流PCB设计中的温升失控、过孔瓶颈等核心挑战,提升设计效率和可靠性。

weixin_34194829的博客 450

多态与虚函数

C++ 多态 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 下面的实例中,基类 Shape 被派生为两个类,如下所示: #include <iostream> using namespace std; class Sh...

weixin_30920513的博客 355

Matterport3D数据集介绍与下载(全网最详细)

Matterport3D数据集介绍与下载(全网最详细)

shannanshouyin的博客 2165

多态与重载

多态和重载前言一、多态1. 定义格式2. 多态的特点3. 多态的示例二、重载1. 重载的作用2. 重载的原则3. 重载的示例2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、多态 多态是指某对象的某一行为在不同情况下的不同表现形式。 1. 定义格式 定义格式:父类类型 变量名=new 子类类型(); // D.

m0_47597369的博客 2695

Linux系统centos7安装网卡驱动

有时候我们装完Centos或Ubuntu系统会发现没有网卡信息,说明网卡驱动不配置,所以我们要重新安装。 首先去服务器主板官网下载网卡驱动,注意32位和64位。 先查看网卡型号 lspci | grep -i ethernet 我的网卡型号是 00:1f.6 Ethernet controller: Intel Corporation Device 0d55。 网上一找,压根没找到这型号的网卡,别说驱动了。怀着试一试的心态,就安装i219-v系的网卡驱动,还别说,成功了。 针对i21...

wshc18的博客 2万+

INCA文件刷写全流程:从ES581驱动安装到XCP协议实战(附避坑指南)

本文详细解析INCA文件刷写的全流程操作,从ES581驱动安装到XCP协议配置,提供实战经验与避坑指南。涵盖A2L文件校验、工作区优化、XCP参数调优及自动化刷写技巧,帮助工程师高效完成ECU开发中的文件刷写任务。

egg99的博客 942

java和c++中的多态、重载、覆盖、隐藏

java和c++中的多态、重载、覆盖、隐藏  1、java中的重载(overload):对于类的方法(包括从父类中继承的方法),方法名相同,参数列表不同的方法之间就构成了重载关系。 (1)       什么叫参数列表?指三样东西:参数的类型,参数的个数,参数的顺序。这三者只要有一个不同就叫做参数列表不同。 (2)       重载关系只能发生在同一个类中吗?非也。要知道一

chengyinlei418的专栏 496

有趣的方式学习DDR5(4)—— DDR5 SDRAM 启动与初始化过程全攻略

🟢。

weixin_43199439的博客 1623

C++多态与多态原理以及重载和重写(覆盖)的区别

C++多态与多态原理以及虚函数表多态多态原理重载和重写(覆盖)的区别 多态 多态分为两类:静态多态(编译时多态)和动态多态(运行时多态)   静态多态就是我们所熟悉的函数重载和运算符重载,而派生类和虚函数实现动态多态。   静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态

kuanyew的博客 3984

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

Liuqz2009的专栏 6506

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++多态、重载、覆盖、隐藏

C++多态、重载、覆盖、隐藏 1. 多态 在基类中定义一个虚函数,然后在派生类中又定义一个同名,同参数表的函数,这就是多态。多态采用了动态绑定技术。

享受当下 632

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

详解一道C++笔试题,考察重载、覆盖、多态

C++版看到的,说是面试宝典里的题目,考察重载、覆盖、多态等概念,比较有代表性。今天早上远程辅导 Yan Wang 同学学习 Qt 时还想到了这个题目,如果你能够正确理解这个题目,说明对于 C++ 中的函数重载、覆盖、虚函数、多态等有了正确的认识。然后呢,再来学习 Qt 就顺风顺水了。

安晓辉生涯——聚焦程序员的职业规划与成长 9015

详细全面讲解C++中重载、隐藏、覆盖的区别

综上所述,函数重载、覆盖和隐藏有着不同的定义、使用场景和特点,正确理解它们之间的区别对于掌握C++的面向对象编程、多态机制以及类之间的函数调用关系等方面有着重要的意义。类中重写后的版本,体现了多态性。函数时,编译器根据传入的实际参数情况来选择匹配的重载函数进行调用。类自身定义的函数,如果要访问基类中被隐藏的同名函数,需要通过。函数有多个重载形式,有的重载函数参数个数不同(如两个。参数的版本),有的重载函数参数类型不同(如。函数时,则分别调用各自类中定义的函数。函数时,编译器会认为是调用。

doubleintfloat的博客 2088

【C++ - 19】C++中重载和覆盖的区别

一. 重载(overload) 1. 重载指的是函数具有的不同的参数列表,而函数名相同的函数。重载要求参数列表必须不同,比如参数的类型不同、参数的个数不同、参数的顺序不同。 2. 如果仅仅是函数的返回值不同是没办法重载的,因为重载要求参数列表必须不同。 3. 程序是根据参数列表来确定具体要调用哪个函数的 4. 看下面几个例子 void Fun(int a); void Fun(d...

藏经阁 | 玄苦 1万+

C++ 覆盖 重载 隐藏 浅析

本文首先阐释覆盖和重载的基本定义以及它与异常类型、异常数目还有返回值等相关概念间的关系;然后,介绍多态与虚函数等相关概念,并给出代码示例,以比较说明基类指向子类对象地址的指针与子类指向强制转换为子类的基类对象地址的指针在虚函数与一般成员函数(也是隐藏机制的函数)上,输出情况的异同;最后,阐明隐藏等相关概念,给出代码示例,以比较说明指向子类对象地址的基类指针和子类指针在虚函数、隐藏函数、一般成员函数上输出的异同。 【文末,给出本文最关键的一句话,

稚枭天卓 2509

C++:成员函数的重载、覆盖与隐藏 、多态

  返回《C++知识要点》  参考:《[C++基础]重载、覆盖、多态与函数隐藏》一、重载与覆盖 :成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual

sunandfree的专栏 1294

覆盖、重载、多态

覆盖:在基类中定义了一个非虚拟函数,然后在派生类中又定义了一个同名同参数同返回类型的函数,这就是覆盖了。在派生类对象上直接调用这个函数名,只会调用派生类中的那个。重载:在基类中定义了一个非虚拟函数,然后在派生类中定义一个同名,但是具有不同的参数表的函数,这就是重载。在派生类对象上调用这几个函数时,用不同的参数会调用到不同的函数,有可能会直接调用到基类中的那个。多态:在基类中定义

*^^^^^^^* 1354

C++中的重载、覆盖(多态)和隐藏

介绍C++中重载、覆盖和隐藏三个概念。

六轱辘的专栏 764

C++父类与子类关系以及函数重载、覆盖和隐藏规则

今天去HTC面试,笔试考了逻辑、c语言、c++语言几个部分,C/C++考的全是基本语法,没有考算法。C语言部分做的还不错,C++部分却做的那么多不确定,其中大部分是C++父子类之间关系以及函数重载、覆盖以及隐藏规则。 在C++语言中,虚函数是非常重要的概念,虚函数是实现C++面向对象中多态性和继承性的基石。而多态性和继承性则是面向对象语言的精髓。掌握虚函数才算是真正掌握C++语言,而C++语言中

清闲老窝的专栏 2万+

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

“重写(覆盖)、重载、重定义、多态” 绝对称得上是C++里一个比较经典的问题了,下面我们来层层剖析它。 重写(覆盖)override 重写又名覆盖,常见于子类继承父类的时候,子类重写父类的某些方法。 有如下要求: 父类中被重写的方法必须是virtual的 子类中进行重写操作的那个方法,访问修饰符和父类的可以不同(即根据自身需要选择public、protected、private), 但是返回值...

吟游诗人——吟唱生命的不朽 1318

C++ 重载、隐藏、覆盖

本文通过C++代码示例深入解析了重载(Overload)、覆盖(Override)和隐藏(Hide)三个核心概念的区别。重载指同一作用域内函数名相同但参数不同的函数,用于实现不同参数调用;覆盖是子类对父类虚函数的重写,需完全一致签名,实现多态;隐藏则是子类同名函数遮蔽父类函数,无论参数或虚函数与否。文章详细分析了代码案例,对比了三者的适用场景、绑定方式和调用规则,并提供了解除隐藏的方法。最后通过完整代码演示了三种机制的实际应用场景。

doubleintfloat的博客 917
上一篇: C++ Primer--虚函数与纯虚函数的区别
下一篇: pip的安装,更新,卸载模块以及使用方法 python
Walker Zhang
博客等级 码龄14年 144粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值