C++ 中函数重载、覆盖与隐藏详解

yizhihongxing

C++ 中函数重载、覆盖与隐藏详解

什么是函数重载

C++ 中的函数重载是指在同一个作用域(Scope)内定义多个同名函数,但是他们的参数个数、参数类型、返回值类型中至少有一个不同。在调用函数时,编译器会根据传入的参数类型和个数的不同来判断调用哪一个函数。

下面是一个函数重载的简单示例:

#include <iostream>

using namespace std;

void print(int i) {
    cout << "The integer value is " << i << endl;
}

void print(double f) {
    cout << "The float value is " << f << endl;
}

int main() {
    print(10); // 调用第一个 print 函数,输出 "The integer value is 10"
    print(3.14); // 调用第二个 print 函数,输出 "The float value is 3.14"
    return 0;
}

什么是函数覆盖

函数覆盖(Override)是指一个派生类中的成员函数覆盖了其基类中的同名函数,且参数列表必须完全匹配。在调用派生类对象的该函数时,会优先调用派生类中的函数,而不是基类中的函数。

下面是一个函数覆盖的示例:

#include <iostream>

using namespace std;

class Animal {
public:
    virtual void speak() { // 基类中的成员函数
        cout << "This is an animal." << endl;
    }
};

class Dog : public Animal {
public:
    virtual void speak() { // 派生类中的成员函数,覆盖了基类中的 speak 函数
        cout << "This is a dog." << endl;
    }
};

int main() {
    Animal * animalPtr;
    Dog dog;
    animalPtr = &dog;
    animalPtr->speak(); // 输出 "This is a dog."
    return 0;
}

什么是函数隐藏

函数隐藏(Hide)是指一个派生类中的成员函数隐藏了其基类中的同名函数,此时无论使用哪个类作为调用者,都只会调用派生类中的函数,不会调用基类的函数。函数隐藏与函数覆盖不同,因为隐藏函数必须与被隐藏函数在同一个作用域中,且参数列表不必匹配,只需要函数名相同即可。

下面是一个函数隐藏的示例:

#include <iostream>

using namespace std;

class Animal {
public:
    void speak() { // 基类中的成员函数
        cout << "This is an animal." << endl;
    }
};

class Dog : public Animal {
public:
    void speak(int i) { // 派生类中的成员函数,隐藏了基类中的 speak 函数
        cout << "This is a dog." << endl;
    }
};

int main() {
    Animal animal;
    Dog dog;
    animal.speak(); // 输出 "This is an animal."
    dog.speak();    // 输出 "This is a dog."
    return 0;
}

总结:

  • 函数重载是指在同一作用域内定义多个同名函数,但参数类型、个数、返回值类型至少有一个不同,编译器在调用时会根据参数类型和个数的不同来判断调用哪个函数。
  • 函数覆盖是指派生类中的成员函数覆盖了其基类中的同名函数,且参数列表必须完全匹配,调用该函数时会优先调用派生类中的函数。
  • 函数隐藏是指派生类中的成员函数隐藏了其基类中的同名函数,不论使用哪个类作为调用者,都只会调用派生类中的函数,函数参数列表不必匹配。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中函数重载、覆盖与隐藏详解 - Python技术站

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

相关文章

  • vue中使用echarts从后端获取数据并赋值显示

    Vue中使用ECharts从后端获取数据并赋值显示 ECharts是一个基于JavaScript的开源可视化库,可以用于创建各种类型的图表。在Vue中使用ECharts可以轻松地创建交互式图表,并从后端进行显示。以下是关于Vue中使用ECharts从后端获取数据并赋值显示的完整攻略,包括两个示例说明。 步骤1:安装ECharts 在Vue中使用ECharts…

    other 2023年5月9日
    00
  • 魔兽世界怀旧服狂暴战输出循环怎么样 狂暴战PVE手法分享

    魔兽世界怀旧服狂暴战输出循环怎么样 – 狂暴战PVE手法分享 狂暴战PVE输出循环 狂暴战的PVE输出循环可以分为两个阶段:暴饮暴食和食指扫射。下面我们来详细讲解这两个阶段的循环: 暴饮暴食阶段 在暴饮暴食阶段,你需要先进行冲锋,然后使用图腾破,接着使用斩杀,这样能够让你尽快进入狂怒模式。在狂怒模式下,你需要保持暴击率尽可能高,所以在能够的情况下优先选择暴击…

    other 2023年6月27日
    00
  • iframe-https页面内的httpsiframe无法正常工作

    iframe-https页面内的https iframe无法正常工作攻略 在Web开发中,我们经常使用iframe来嵌入其他网站的内容。但是,在某些情况下,当我们在HTTPS页面中嵌入HTTPS的iframe时,可能会到无法正常工作的问题。在攻略中,我们将介绍这个的原因,并提供一些解决方案和示例。 原因 HTTPS页面中嵌入HTTPS的iframe无法正常工…

    other 2023年5月9日
    00
  • .net获取本机公网IP地址示例

    获取本机公网IP地址示例攻略 简介 在.NET中获取本机公网IP地址可以通过使用第三方API或者直接访问网络接口来实现。下面将提供两个示例来说明如何获取本机公网IP地址。 示例一:使用第三方API 首先,我们需要选择一个可靠的第三方API来获取公网IP地址。一个常用的选择是ipify,它提供了一个简单的HTTP接口来获取公网IP地址。 在.NET中,我们可以…

    other 2023年7月31日
    00
  • JS正则表达式 整合 (值得收藏)

    JS正则表达式 整合 (值得收藏)攻略 正则表达式是用于匹配文本的表达式,它是一种强大的文本处理工具。在JavaScript中,也可以使用正则表达式来进行文本处理和匹配。本文将介绍常用的JavaScript正则表达式语法和技巧。 基础语法 使用正则表达式字面量 正则表达式字面量是一种直接使用正则表达式构建正则表达式对象的方式。字面量以斜杠(/)开始和结束。 …

    other 2023年6月27日
    00
  • 如何给虚拟机提速

    如何给虚拟机提速攻略 虚拟机的性能提升可以通过多种方式实现。下面是一些可以帮助您提升虚拟机性能的方法和示例说明。 1. 分配更多的资源 虚拟机的性能受到分配给它的资源的限制。通过增加虚拟机的资源分配,可以提高其性能。 示例说明: 增加内存分配:在虚拟机管理软件中增加虚拟机的内存分配。例如,将虚拟机的内存从2GB增加到4GB,可以提高虚拟机的运行速度和响应能力…

    other 2023年8月1日
    00
  • Win10补丁KB4532693删除个人配置文件解决方法

    Win10补丁KB4532693删除个人配置文件解决方法 最近有很多用户在更新了Win10补丁KB4532693后发现他们的个人配置文件被删除了。这引起了很多用户的恐慌,但不要担心,下面就是解决方法。 问题描述 用户在更新了Win10补丁KB4532693后发现他们的个人配置文件被删除了。这个问题会导致用户的个人数据丢失,而且很多用户无法恢复这些数据。 解决…

    other 2023年6月25日
    00
  • springboot如何读取自定义properties并注入到bean中

    在SpringBoot中,可以使用@ConfigurationProperties注解来读取自定义properties,然后将其注入到bean中。 具体步骤如下: 定义自定义properties文件,在application.properties中定义的属性值,是可以被@ConfigurationProperties读取到的。可以在application.p…

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