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日

相关文章

  • vue实现点击图片放大效果

    实现点击图片放大效果可以通过以下步骤: 步骤一:引入插件 首先,我们需要引入vue-image-markup插件,它是一个可缩放图片插件,能够将图片放大并且支持拖动。环节里有两种引入方式可以选择: 方式一:通过npm安装 npm install vue-image-markup 方式二:通过CDN引入(需要在当前的vue项目中创建公用文件夹) <scr…

    other 2023年6月27日
    00
  • 使用PP助手2.0为IOS设备安装应用程序教程图解

    使用PP助手2.0为iOS设备安装应用程序教程 PP助手2.0是一款非常实用的iOS设备应用安装工具,它可以为您的iOS设备提供海量的应用资源,并且可以简单快速地安装应用程序。下面,我们将通过以下步骤来为您详细讲解如何使用PP助手2.0为iOS设备安装应用程序。 步骤一:下载PP助手2.0 首先,您需要下载并安装PP助手2.0。您可以在PP助手官方网站(ht…

    other 2023年6月25日
    00
  • js解码urlencode编码

    当我们在JavaScript中使用URL时,有时需要对URL进行编码和解码。URL编码是将URL中的特殊字符转换为十六进制编码的过程,而URL解码是将十六进制编码的字符转换回原始字符的过程。在JavaScript中,可以使用encodeURIComponent()和decodeURIComponent()函数来进行URL编码和解码。 URL编码 在JavaS…

    other 2023年5月7日
    00
  • Android 中基于TabLayout+ViewPager实现标签卡效果

    Android 中基于 TabLayout+ViewPager 实现标签卡效果攻略 1. 添加依赖库 首先,在项目的 build.gradle 文件中添加以下依赖库: implementation ‘com.google.android.material:material:1.4.0’ 2. 布局文件 在布局文件中,使用 TabLayout 和 ViewPa…

    other 2023年9月6日
    00
  • python操作adb命令

    当然,我很乐意为您提供有关“Python操作ADB命令”的完整攻略。以下是详细的步骤和两个示例: 1 Python操作ADB命令 ADB(Android Debug Bridge)是一个用于与Android设备通信的命令行工具。Python可以使用subprocess模块来执行ADB命令。以下是使用Python操作ADB命令的步骤: 1.1 安装ADB 首先…

    other 2023年5月6日
    00
  • vue使用自定义指令实现拖拽

    下面我将详细介绍如何使用自定义指令来实现拖拽功能。 什么是Vue自定义指令 Vue自定义指令本质上是一个指令函数,它接收两个参数:被绑定的元素和一个对象。在对象中你可以设置指令的各种选项和事件钩子。 实现拖拽的步骤 下面是实现拖拽功能的步骤: 1. 创建自定义指令 我们需要创建一个自定义指令,来绑定拖拽事件。在Vue中自定义指令可以使用Vue.directi…

    other 2023年6月25日
    00
  • git版本回退

    Git版本回退 Git是一种强大的版本控制系统,它允许我们管理代码的历史记录。当我们开发一个项目时,可能会出现需要回退到之前的某个版本的情况。在这篇文章中,我们将学习如何在Git中回退版本。 查看Git日志 在回退之前,我们需要查看提交历史记录以确定我们要回退的版本。使用以下命令查看Git日志: git log 这将显示提交历史记录。对于每个提交,我们可以看…

    其他 2023年3月28日
    00
  • java应用程序如何自定义log4j配置文件的位置

    要让java应用程序自定义log4j配置文件的位置,我们需要做下面两个步骤: 1.在程序启动时手动加载log4j配置文件并告诉log4j使用该配置文件。 2.将log4j配置文件的位置放到程序的运行参数中,让用户可以自行指定配置文件的位置。 下面分别对这两个步骤进行详细说明: 步骤1:手动加载log4j配置文件 在java程序中使用log4j进行日志输出时,…

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