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++中函数重载、函数重写、函数覆盖三种不同的函数使用方法的详细解释。

阅读剩余 57%

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

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

相关文章

  • 一看就懂的ReactJs基础入门教程-精华版

    一看就懂的ReactJs基础入门教程-精华版 React是一个用于构建用户界面的JavaScript库。它通过组件化的方式,使得开发者可以轻松地构建复杂的UI,并且能够高效地管理状态和数据流。本教程将带你从零开始学习React的基础知识,并通过示例说明来帮助你更好地理解。 准备工作 在开始学习React之前,你需要确保你已经安装了Node.js和npm。如果…

    other 2023年7月28日
    00
  • 全面了解PHP中的全局变量

    全面了解PHP中的全局变量攻略 什么是全局变量? 在PHP中,全局变量是指在脚本的任何地方都可以访问的变量。它们可以在函数内部和外部使用,而不需要特殊的声明或传递。 如何声明和使用全局变量? 在PHP中,要声明一个全局变量,需要使用global关键字。这样可以将变量标记为全局变量,使其在整个脚本中可用。 下面是一个示例,展示了如何声明和使用全局变量: &lt…

    other 2023年7月28日
    00
  • 在vue3项目中使用新版高德地图的完整步骤

    请参考以下步骤: 步骤一:创建高德地图开发者账户 进入高德地图开发者平台,用你的个人账号登录或注册一个新账号。登录后进入”我的应用”页面,创建一个新的应用来获取 key 值。 步骤二:安装AMapJSAPI 在你的Vue 3项目根目录中安装AMapJSAPI模块依赖: npm install @amap/amap-jsapi-loader 步骤三:配置AMa…

    other 2023年6月27日
    00
  • Win7系统修改后缀名无效怎么办?Win7系统修改后缀名无效的解决方法

    Win7系统修改后缀名无效的解决方法攻略 在Win7系统中,有时候我们想要修改文件的后缀名,但却发现修改后缀名无效的情况。这可能是由于一些系统设置或文件属性的原因导致的。下面是解决这个问题的一些方法和示例说明。 方法一:修改文件夹选项 首先,右键单击要修改后缀名的文件,选择“属性”选项。 在属性窗口中,点击“常规”选项卡。 在常规选项卡中,找到“属性”部分,…

    other 2023年8月5日
    00
  • vivo X Flip开发者选项在哪 vivo X Flip进入开发者模式教程

    下面是关于“vivo X Flip开发者选项在哪 vivo X Flip进入开发者模式教程”的详细攻略: 1. 如何打开vivo X Flip的开发者选项 要启用vivo X Flip的开发者选项,您需要按照以下步骤操作: 在vivo X Flip设备上进入“设置”应用。 滚动到底部,点击“关于手机”或“系统版本”,这将显示您的设备的基本信息。 在基本信息页…

    other 2023年6月26日
    00
  • c#笔记获取程序当前目录

    以下是“C#笔记获取程序当前目录的完整攻略,过程中至少包含两条示例说明”。 C#笔记获取程序当前目录的完整攻略 在C#中,我们可以使用多种方法获取程序当前目录。以下是一份关于C#获取程序当前目录的攻略,包括两个示例说明。 1. C#获取程序当前目录的基础知识 在开始获取程序当前目录之前,我们需要掌握一些基础知识,例如: C#的基础知识,包括C#的安装、配置、…

    other 2023年5月10日
    00
  • 一文搞懂Spring中的Bean作用域

    一文搞懂Spring中的Bean作用域 在Spring框架中,Bean作用域定义了在应用程序中创建和管理Bean实例的方式。Spring提供了多种Bean作用域,每种作用域都有不同的生命周期和可见性。本文将详细介绍Spring中的Bean作用域,并提供两个示例来说明其用法。 Singleton作用域 Singleton作用域是Spring中默认的作用域,它表…

    other 2023年8月19日
    00
  • iPhone11怎么强制重启?iPhone11/11pro强制重启图文教程

    iPhone11怎么强制重启? 如果你的iPhone11或iPhone11 Pro在使用过程中出现卡死、屏幕黑屏或无响应等问题,你可以尝试强制重启来解决问题。下面是iPhone11/11Pro强制重启的图文教程。 步骤一:按住侧边按键+音量控制键 在进行强制重启前,请确保你的iPhone11或iPhone11Pro已经连接充电器或电脑并且有足够的电量。否则可…

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