C++深入探究重载重写覆盖的区别

C++深入探究重载、重写、覆盖的区别

在C++中,有三种不同的函数使用方法:重载(Overloading)、重写(Overriding)和覆盖(Hiding)。虽然它们有些相似之处,但它们各自有不同的用途和行为。以下是它们的详细解释。

重载(Overloading)

重载是指定义多个具有相同名称(函数名)但不同参数列表(参数类型、参数个数或参数顺序)的函数。在调用函数时,根据传递给函数的参数自动匹配相应的函数进行调用。例如:

#include <iostream>
using namespace std;

// 函数重载
int add(int a, int b){
    return a + b;
}

double add(double a, double b){
    return a + b;
}

int main(){
    int x = add(3, 4);
    double y = add(2.5, 3.1);
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
    return 0;
}

以上代码定义了两个名为“add”的函数,一个函数接收两个整数参数,另一个函数接收两个双精度浮点数参数。在main函数中,通过传递不同类型的参数来调用不同版本的add函数。这是函数重载的例子。

重写(Overriding)

重写是通过继承,使用派生类中的成员函数来覆盖基类中的同名成员函数。在派生类中实现与基类函数原型相同的函数,这样可以隐藏基类中的函数。例如:

#include <iostream>
using namespace std;

// 基类
class Shape{
public:
    void draw(){
        cout << "Drawing a Shape" << endl;
    }
};

// 派生类
class Rectangle:public Shape{
public:
    void draw(){
        cout << "Drawing a Rectangle" << endl;
    }
};

int main(){
    Shape* shape = new Shape();
    shape->draw();
    Rectangle* rect = new Rectangle();
    rect->draw();
    Shape* rect2 = new Rectangle();
    rect2->draw();
    return 0;
}

以上代码中,我们定义了一个基类Shape和一个派生类Rectangle。在Rectangle类中,我们重新实现了draw函数。在main函数中,我们分别创建了基类Shape和派生类Rectangle对象,并进行了函数调用。注意,当我们创建一个基类指针,指向其派生类的对象时,我们只能调用基类中存在的函数,不能调用派生类中的同名函数。这是因为,指针是基类类型,它只知道基类中存在哪些函数,而不知道派生类中的同名函数。

覆盖(Hiding)

覆盖是指派生类中的函数名与基类中的函数名相同,但参数列表不同。在此情况下,基类的函数将被隐藏,而不是被重写。例如:

#include <iostream>
using namespace std;

// 基类
class Shape{
public:
    void draw(){
        cout << "Drawing a Shape" << endl;
    }
};

// 派生类
class Rectangle:public Shape{
public:
    void draw(int width, int height){
        cout << "Drawing a Rectangle, width = " << width << ", height = " << height << endl;
    }
};

int main(){
    Shape* shape = new Shape();
    shape->draw();
    Rectangle* rect = new Rectangle();
    rect->draw(10, 5);
    Shape* rect2 = new Rectangle();
    // 下面一行代码无法编译,因为Shape类没有draw(int, int)函数
    // rect2->draw(8, 6);
    return 0;
}

以上代码中我们同样定义了一个基类Shape和一个派生类Rectangle。在Rectangle类中,我们定义了一个名为draw的函数,其参数列表与基类中的draw函数不同。在main函数中,我们分别创建了基类Shape和派生类Rectangle对象,并进行了函数调用。注意,当我们创建一个基类指针,指向其派生类的对象时,并尝试调用派生类中的不存在于基类的函数(单纯继承),编译器会显示编译错误。

以上就是C++中函数重载、函数重写、函数覆盖三种不同的函数使用方法的详细解释。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++深入探究重载重写覆盖的区别 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Sqlmap爆库命令的简单使用

    Sqlmap爆库命令的简单使用 Sqlmap是一个流行的自动化数据库注入工具,它能够检测和发现Web应用程序中的SQL注入漏洞,并且能够对受影响的数据库发起攻击行动。本文将简要介绍Sqlmap的基本用法和命令,帮助读者快速了解如何使用Sqlmap进行爆库操作。 准备工作 首先,需要确保已经安装好了Sqlmap,可以从Sqlmap的官方网站或者Github上获…

    其他 2023年3月28日
    00
  • JPA中JpaRepository接口的使用方式

    当使用JPA(Java Persistence API)时,我们可以通过JpaRepository接口来简化我们对数据库的操作。JpaRepository是Spring Data JPA提供的一个通用接口,它提供了一组基础的功能方法,如保存、删除、查询等,以及支持自定义查询。 以下是使用JpaRepository接口的详细攻略: 1. 定义实体类 首先,我们…

    other 2023年6月28日
    00
  • 织梦dedecms 本地模板安装图文方法

    关于“织梦dedecms 本地模板安装图文方法”的完整攻略,我将分步骤进行讲解,并提供两个示例说明。 步骤1:下载模板 在安装模板之前,首先需要下载所需要的模板。可以在官方网站上下载,也可以在第三方网站上下载,需要注意的是,下载的模板文件必须是zip压缩格式。 步骤2:解压缩模板文件 将下载的zip压缩文件解压缩,可以使用压缩软件,比如WinRAR等。解压缩…

    other 2023年6月27日
    00
  • 【转】spdy协议

    【转】SPDY协议 今天我们要转发一篇来自互联网协议工程师的介绍SPDY协议的文章,希望给大家的网络技术学习带来一些帮助。 什么是SPDY协议? SPDY是一种由Google推出的基于TCP协议的网络传输协议,旨在缩短网页加载时间、减少网络延迟和优化用户的网络体验。SPDY代替HTTP协议进行数据传输,服务器和客户端之间的数据传输更快和可靠,同时能够减少网络…

    其他 2023年3月28日
    00
  • 魔兽世界7.2永夜大教堂怎么打_永夜大教堂打法攻略

    魔兽世界7.2永夜大教堂怎么打_永夜大教堂打法攻略 永夜大教堂是《魔兽世界》7.2版本新增的一个副本,难度较高,需要进行详细的攻略。以下是永夜大教堂的打法攻略: 前置条件 要进入永夜大教堂,需要满足以下条件: 必须达到110级; 需要完成守望者要塞的主线任务; 需要完成“死亡之翼的背叛”和“封印命运”两个成就。 十二个BOSS的打法详解 在永夜大教堂中,总共…

    other 2023年6月26日
    00
  • centos7进入救援模式的方法

    当您的CentOS 7系统出现问题时,您可以进入救援模式来修复问题。以下是进入CentOS 7救援模式的方法的详细攻略: 方法1:使用CentOS 7安装介质 插入CentOS 7安装介质并启动计算机。 在引导菜单中选择“Troubleshooting”。 选择“Rescue a CentOS system”。 选择语言和键盘布局。 选择“Continue”…

    other 2023年5月7日
    00
  • Java编程实现从尾到头打印链表代码实例

    下面是Java编程实现从尾到头打印链表代码实例的完整攻略。 1. 思路分析 从尾到头打印链表,可以想到两种方式: 反转链表,并正序打印 从尾到头遍历链表,借助栈的先进后出特性 我们可以选择使用第二种方式来实现。具体步骤如下: 从头到尾遍历链表,将节点值依次入栈 遍历完整个链表后,依次弹出栈的元素,即可实现从尾到头打印链表 2. 代码实现 2.1 定义List…

    other 2023年6月27日
    00
  • PHP 获取客户端真实IP地址多种方法小结

    PHP 获取客户端真实IP地址多种方法小结 在开发 Web 应用程序时,有时需要获取客户端的真实 IP 地址。然而,由于代理服务器和负载均衡器的存在,直接获取客户端 IP 地址变得有些困难。下面是几种常用的方法来获取客户端真实 IP 地址的攻略。 方法一:使用 $_SERVER 变量 PHP 提供了一个名为 $_SERVER 的超全局变量,其中包含了客户端请…

    other 2023年7月30日
    00
合作推广
合作推广
分享本页
返回顶部