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

yizhihongxing

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日

相关文章

  • python中读取txt文件时split()函数的妙用

    Python中读取txt文件时split()函数的妙用攻略 在Python中,我们经常需要读取文本文件并对其进行处理。split()函数是一个非常有用的方法,可以将字符串按照指定的分隔符进行拆分。下面是使用split()函数读取txt文件的详细攻略: 打开文件:首先,使用open()函数打开要读取的txt文件,并将其赋值给一个变量,如file。 python…

    other 2023年10月18日
    00
  • 6款实用的硬盘、ssd固态硬盘、u盘、储存卡磁盘性能测试工具

    6款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具 为了更好地测试硬盘、SSD固态硬盘、U盘和储存卡等存储设备的性能,提高存储设备的管理效率,有必要了解一些性能测试工具。本文将介绍6款实用的硬盘、SSD固态硬盘、U盘和储存卡磁盘性能测试工具。 1. Crystaldiskmark Crystaldiskmark是一款用于测试硬盘和SSD固态硬盘性能…

    其他 2023年3月28日
    00
  • Android实现启动引导图

    Android实现启动引导图攻略 启动引导图是在用户第一次打开应用程序时显示的一组屏幕,用于向用户展示应用程序的功能和特性。下面是实现启动引导图的完整攻略。 步骤1:准备资源 首先,您需要准备启动引导图所需的资源,包括图片、文本等。将这些资源添加到您的项目的res目录下。 步骤2:创建引导图布局 在res/layout目录下创建一个新的布局文件,用于显示引导…

    other 2023年8月21日
    00
  • git篇—创建远程仓库

    Git篇:创建远程仓库的完整攻略 在使用Git进行版本控制时,我们通常需要将本地仓库同步到远程仓库中,以便多人协作开发或备份代码。下面是创建远程仓库的完整攻略,包括两个示例说明。 步骤1:创建远程仓库 首先,我们需要在Git托管平台上创建一个远程仓。以GitHub为例,我们可以按照以下步创建一个远程仓库: 登录GitHub账号,进入主页。 点击右上角的“+”…

    other 2023年5月9日
    00
  • Android仿百度外卖自定义下拉刷新效果

    Android仿百度外卖自定义下拉刷新效果 在开发 Android 应用中,下拉刷新是一个很常见的需求。本篇教程将会介绍如何仿百度外卖的下拉刷新效果。 1. 布局 在布局文件中添加一个 SwipeRefreshLayout 控件作为父控件,并把需要刷新的布局放在其中。 示例代码: <androidx.swiperefreshlayout.widget.…

    other 2023年6月26日
    00
  • js获取随机数

    当然,我很乐意为您提供有关“JavaScript获取随机数”的完整攻略。以下是详细的步骤和两个示例: 1 JavaScript获取随机数 在JavaScript中,可以使用Math对象的方法来获取随机数。Math对象提供了几个方法来生成随机数,包random()、floor()和ceil()等。 2. JavaScript获取随机数的方法 以下是获取随机数的…

    other 2023年5月6日
    00
  • 设置qtablewidget的样式表

    设置QTableWidget的样式表 在Qt中,QTableWidget是一种常见的表格控件,用于显示和编辑表格数据。我们可以使用样式表来自定义QTable的外观和样式。本攻略将详细介绍如何设置QTableWidget的样式表,包括两个示例说明。 步骤 以下是设置QTableWidget的样式的步骤: 创建一个QTableWidget对象。 python t…

    other 2023年5月7日
    00
  • WebStorm(Amaze开发工具)–JavaScript 开发工具

    WebStorm(Amaze开发工具)——JavaScript 开发工具 WebStorm是一款由JetBrains公司推出的JavaScript集成开发环境,非常适合JavaScript开发者。它的强大之处在于提供了丰富的功能和组件,包括代码自动完成、代码检查、调试、测试、版本控制、监控等等。此外,WebStorm还有诸如自动格式化代码、重构代码、语法高亮…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部