重载(Overloading)、覆盖(Override)和隐藏(Hide)

news/2024/10/21 5:50:37/

重载(Overloading)、覆盖(Override)和隐藏(Hide)是C++中面向对象编程中的三个重要概念,用于处理函数和成员的多态性和继承关系。

重载(Overloading):

  • 重载是指在同一个作用域内,通过定义具有相同名称但参数类型或数量不同的多个函数或操作符。

  • 重载允许使用相同的名称来表示一组功能类似但参数不同的操作,从而方便程序员使用。

  • 重载函数的选择是根据传递给函数的参数类型和数量来进行的,称为静态多态性(编译时多态)。

示例:

void print(int num) {// 打印整数
}
​
void print(double num) {// 打印浮点数
}
​
print(10);  // 调用 print(int)
print(3.14);  // 调用 print(double)

覆盖(Override):

  • 覆盖是指在派生类中重新定义基类中已有的虚函数,以改变其行为。

  • 覆盖允许派生类提供自己特定的实现,使得通过基类指针或引用调用虚函数时,能够根据实际对象类型来动态调用正确的函数。

  • 覆盖需要使用相同的函数签名(函数名称、参数类型和返回类型)。

示例:

class Base {
public:virtual void display() {// 基类的实现}
};
​
class Derived : public Base {
public:void display() override {// 派生类的实现,覆盖了基类的 display 函数}
};
​
Base* ptr = new Derived();
ptr->display();  // 动态调用派生类的 display 函数

重载与覆盖的区别:

  • 覆盖是父类和子类之间的垂直关系,重载是不同函数之间的水平关系

  • 覆盖要求参数列表相同,重载则要求参数列表不同,返回值不要求

  • 覆盖关系中,调用方法根据对象类型决定,重载根据调用时实参表与形参表的对应关系来选择函数体

隐藏(Hide):

  • 隐藏是指在派生类中定义与基类中同名但参数不同的函数,从而隐藏了基类的函数。

  • 隐藏会使得通过基类指针或引用调用函数时,只能调用到基类的函数,无法动态调用派生类中的同名函数。

  • 隐藏只发生在非虚函数中,不涉及动态多态性。

示例:

class Base {
public:void display() {// 基类的实现}
};
​
class Derived : public Base {
public:void display(int num) {// 派生类的实现,隐藏了基类的 display 函数}
};
​
Base* ptr = new Derived();
ptr->display();  // 调用基类的 display 函数,无法调用派生类的 display 函数

区别与联系:

区别:

  1. 适用范围:

    • 重载:重载可以在同一个作用域内定义具有相同名称但参数类型或数量不同的多个函数或操作符。

    • 覆盖:覆盖是在派生类中重新定义基类中已有的虚函数,以改变其行为。

    • 隐藏:隐藏是在派生类中定义与基类中同名但参数不同的函数,从而隐藏了基类的函数。

  2. 静态多态性 vs 动态多态性:

    • 重载:重载是静态多态性的一种,编译器根据传递给函数的参数类型和数量来选择调用哪个重载函数。

    • 覆盖:覆盖是动态多态性的一种,通过基类指针或引用调用虚函数时,会根据实际对象类型来动态调用正确的函数。

    • 隐藏:隐藏只发生在非虚函数中,不涉及动态多态性。

  3. 参数和函数签名:

    • 重载:重载函数具有相同的名称,但参数类型或数量不同,重载函数的选择是根据传递给函数的参数类型和数量来进行的。

    • 覆盖:覆盖函数具有相同的函数签名(函数名称、参数类型和返回类型),在派生类中重新定义基类中的虚函数。

    • 隐藏:隐藏函数具有相同的名称,但参数类型不同,隐藏函数在派生类中定义,从而隐藏了基类的函数。

联系:

  1. 都涉及函数或成员的命名冲突和多态性处理。

  2. 覆盖和隐藏都涉及到继承关系,即派生类和基类之间的关系。

  3. 重载、覆盖和隐藏都是C++中用于处理多态性和函数重定义的重要特性。

需要根据具体的需求和场景选择合适的技术,使用重载、覆盖和隐藏来达到预期的效果。重载用于不同参数的函数重载,覆盖用于实现运行时多态性,隐藏用于在派生类中隐藏基类的函数。理解它们之间的区别和联系有助于正确使用这些特性,提高代码的可读性和可维护性。

总结:

  • 重载允许在同一作用域内定义具有相同名称但不同参数的函数。

  • 覆盖允许在派生类中重新定义基类中的虚函数,以改变其行为,实现运行时多态性。

  • 隐藏在派生类中定义与基类同名但参数不同的函数,隐藏了基类的函数,使得无法动态调用派生类中的同名函数。


http://www.ppmy.cn/news/617425.html

相关文章

戴尔驱动下载

第一步 获取服务编号 第二步 第三步 红框里的驱动都是最基础的, 其他的选择性安装或者不安装都行

DELL R系列服务器网卡驱动升级过程

戴尔R系列的服务器linux自带的网卡驱动有bug会造成网络中断,需要升级网卡驱动程序。 1、查看网卡的类型,驱动程序的版本,根据网卡类型下载相应的驱动。 lspci |grep Ethernet lsmod |grep bnx2 modinfo bnx2 wget http://zh-cn.broa…

s110 raid linux,dell s110阵列卡驱动下载

dell s110阵列卡驱动是由戴尔官方打造的一款用于Dell PowerEdge服务器RAID卡 s110的驱动程序,可以方便快速的帮助大家更好的配置此阵列卡.有需要的朋友就来IT猫扑下载吧! s110阵列卡驱动文件说明 文件名:DELL_PERC-S110-INTEGRATED_A00_R318288.exe 下载类型&#x…

SQLite: 轻量级嵌入式数据库引擎的全面介绍

当然,我可以帮您生成一篇关于SQLite的博客文章,按照Markdown(.md)格式进行排版。请注意,我将根据我的知识生成文章,但可能会有一些细节上的差异或限制。以下是一篇示例博客文章: SQLite简介 S…

GPU相关使用命令

相关使用命令 实时监控GPU使用情况: watch -n 0.5 nvidia-smi查看GPU型号: lspci | grep -i vga 对应的查询网站: GPU型号查询直接查看命令: nvidia-smi -a |grep -i Product\ Name

微软Surface Book 2终止更新日前推迟,将与Surface Pro 6同日结束服务

近日有消息称,微软公布了旗下Surface系列设备的更新支持终止日期,并且包括新发布的设备和前代产品。 早在本月23日,微软就为Surface Book 2推送了新的固件,主要提升了Surface Dock 2的稳定性,及其他一些安全更新。  …

报错解决:windows批处理bat文件切换含有中文字符的路径无法识别中文字符(乱码)

在 Windows 批处理中,如果路径中含有中文字符,可能会出现乱码的情况。 在批处理文件开头添加以下语句: chcp 65001这个命令可以将命令行窗口的字符编码设置为 UTF-8,从而支持中文字符。 在使用以上方法时,需要确保路…

基于Java理发店会员管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…