C++之重载 重定义与重写用法详解

yizhihongxing

C++之重载 重定义与重写用法详解

重载(Overload)

在C++中,重载指的是使用同一个函数名,但是参数类型或数量不同。在编译时,编译器根据实参的类型和数量,自动匹配相应的函数调用。函数的返回类型可以相同也可以不同。例如:

int add(int a, int b){
    return a + b;
}
float add(float a, float b, float c){
    return a + b + c;
}

在上面的代码中,add()函数被重载了两次,分别实现了两个不同的功能。第一个函数实现了两个整数的相加,第二个函数实现了三个浮点数的相加。在调用这两个函数时,编译器会根据实参的类型和数量,自动匹配相应的函数调用。

重定义(Override)

重定义指的是在派生类中重新定义(覆盖)基类中的同名函数。在重定义中,函数名和参数类型和数量都必须与基类函数完全相同。例如:

class Shape{
protected:
    int width, height;
public:
    void setWidth(int w){
        width = w;
    }
    void setHeight(int h){
        height = h;
    }
    virtual int area(){ // 虚函数
        cout << "Parent's area: " << endl;
        return 0;
    }
};
class Rectangle:public Shape{
public:
    int area(){ // 重定义虚函数
        cout << "Rectangle's area: " << endl;
        return (width * height);
    }
};

在上面的代码中,基类Shape有一个虚函数area(),该函数被派生类Rectangle重定义(Override)。在调用Rectangle的area()函数时,会优先调用派生类中的函数。例如:

Shape* shape1 = new Shape(); // 声明基类指针
Shape* shape2 = new Rectangle(); // 声明派生类指针

// 调用基类成员函数 getWidth()
shape1->setWidth(5);
shape1->setHeight(7);

// 调用派生类成员函数 getWidth()
shape2->setWidth(5);
shape2->setHeight(7);

// 输出结果
cout << "Shape's area: " << shape1->area() << endl;
cout << "Rectangle's area: " << shape2->area() << endl;

以上代码中,shape1和shape2分别指向基类Shape和派生类Rectangle的对象。因为area()函数是虚函数,所以在调用shape2->area()时,会优先调用Rectangle中的area()函数,输出结果为"Rectangle's area:"。

重写(Redeclare)

重写指的是在同一个作用域中,根据需要多次声明同名标识符。在重写中,函数名和参数类型可以相同也可以不同,但是返回类型必须相同。例如:

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

在上面的代码中,add()函数被重写了两次。第一个函数实现了两个整数的相加,第二个函数实现了一个double和一个整数的相加,将double类型的a强制转换为int类型。在调用这两个函数时,编译器会根据实参的类型和数量,自动匹配相应的函数调用。

示例1

下面的示例演示了重载的使用。它定义了两个函数,分别实现两个浮点数和三个浮点数的相加。当调用这两个函数时,编译器会根据实参的类型和数量,自动匹配相应的函数调用。

#include <iostream>
using namespace std;

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

float add(float a, float b, float c){
    return a + b + c;
}

int main(){
    cout << add(1.1f, 2.2f) << endl; // 输出3.3
    cout << add(1.1f, 2.2f, 3.3f) << endl; // 输出6.6
    return 0;
}

示例2

下面的示例演示了重定义的使用。它定义了两个类,分别是基类Shape和派生类Rectangle。在派生类Rectangle中,重定义了基类Shape的虚函数area()。当调用派生类的area()函数时,会优先调用派生类中的函数。

#include <iostream>
using namespace std;

class Shape{
protected:
    int width, height;
public:
    void setWidth(int w){
        width = w;
    }
    void setHeight(int h){
        height = h;
    }
    virtual int area(){
        cout << "Parent's area: " << endl;
        return 0;
    }
};

class Rectangle:public Shape{
public:
    int area(){
        cout << "Rectangle's area: " << endl;
        return (width * height);
    }
};

int main(){
    Shape* shape1 = new Shape(); // 声明基类指针
    Shape* shape2 = new Rectangle(); // 声明派生类指针

    // 调用基类成员函数 getWidth()
    shape1->setWidth(5);
    shape1->setHeight(7);

    // 调用派生类成员函数 getWidth()
    shape2->setWidth(5);
    shape2->setHeight(7);

    // 输出结果
    cout << "Shape's area: " << shape1->area() << endl;
    cout << "Rectangle's area: " << shape2->area() << endl;

    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++之重载 重定义与重写用法详解 - Python技术站

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

相关文章

  • 微信小程序Echarts动态使用及图表层级踩坑解决方案

    微信小程序Echarts动态使用及图表层级踩坑解决方案 背景 微信小程序是一款便捷的开发平台,而Echarts又是一款非常强大的数据可视化工具,将二者结合起来可以展现出更加生动、形象的数据图表。但是在实际的开发中,我们可能会遇到一些问题,例如动态使用Echarts和图表层级问题等。 动态使用Echarts 在小程序开发中,我们希望在不同的页面中使用不同的图表…

    other 2023年6月26日
    00
  • 太吾绘卷报错怎么办 更新后报错或找不到存档解决方法

    太吾绘卷报错怎么办 更新后报错或找不到存档解决方法 更新后游戏报错 若在更新后启动太吾绘卷时出现报错信息,可以根据以下步骤来解决: 检查游戏更新是否完整,可以重新验证游戏文件完整性,具体操作如下: 在Steam中右键点击游戏名称,选择“属性”。 在“属性”窗口中选择“本地文件”标签页,点击“验证游戏文件完整性”按钮,等待验证完成。 如果有缺失或损坏的文件会自…

    other 2023年6月27日
    00
  • 微信小程序全局变量改变监听的实现方法

    微信小程序全局变量改变监听的实现方法攻略 在微信小程序中,要实现全局变量的改变监听,可以通过以下步骤进行操作: 步骤一:创建全局变量 首先,在小程序的app.js文件中创建一个全局变量,可以使用getApp()方法获取小程序实例,并在实例中定义全局变量。例如: // app.js App({ globalData: { count: 0 } }) 在上述示例…

    other 2023年7月29日
    00
  • win10电脑运行库提示rundll32.exe应用程序错误怎么解决

    Win10电脑运行库提示rundll32.exe应用程序错误解决攻略 问题背景 在使用Win10电脑时,可能会遇到运行库提示rundll32.exe应用程序错误的问题。这个问题通常会显示一条类似于“需要MSVCR120.dll来运行此应用程序”的错误提示,导致一些软件无法正常运行。本篇攻略将详细介绍如何解决这个问题。 解决方案 1. 重新安装Microsof…

    other 2023年6月25日
    00
  • 局域网共享常见问题解决汇集

    局域网共享常见问题解决汇集 在局域网中共享文件和打印机是很常见的需求。然而,在实际使用中我们可能会遇到各种问题,例如连接不上、速度慢、权限不足等等。本文将介绍几种常见的问题及其解决方法。 问题1:连接不上共享文件夹 症状 当尝试连接共享文件夹时,可能会弹出错误消息,显示无法连接到网络位置。这可能是由于网络连接问题或共享设置问题导致的。 解决方法 确保电脑已经…

    other 2023年6月27日
    00
  • ThinkPHP 3使用OSS的方法

    请看详细讲解“ThinkPHP 3使用OSS的方法”的完整攻略。 什么是OSS? OSS(Object Storage Service)是一个支持海量数据存储和访问的分布式存储服务,是阿里云提供的一种云存储服务。 使用OSS可以方便地将文件存储在云端,方便进行管理,同时可以提高文件访问速度。 ThinkPHP 3使用OSS方法 为了方便ThinkPHP 3中…

    other 2023年6月27日
    00
  • Java Spring-IOC容器与Bean管理之基于注解的方式案例详解

    Java Spring-IOC容器与Bean管理之基于注解的方式案例详解 1. 什么是Spring IOC容器与Bean管理 Spring IOC(Inversion of Control)容器是Spring框架的核心部分,它负责管理应用程序中的对象(Bean)的创建、配置和依赖注入。通过IOC容器,我们可以实现松耦合、可扩展和可测试的应用程序。 Bean是…

    other 2023年10月16日
    00
  • 浅谈MFC 改变控件大小和位置

    下面我将详细讲解 “浅谈MFC 改变控件大小和位置” 的完整攻略,包括以下几个步骤: 1. 确定控件ID 首先我们需要确定需要改变大小和位置的控件ID,在MFC中,每个控件都有一个独有的ID,可以在resource.h中进行设置或修改。具体方法如下: 在资源视图中打开对应的资源文件,找到需要改变大小和位置的控件,在右键菜单中选择“属性”项(或者直接双击该控件…

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