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

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

在C++语言中,函数扮演着很重要的角色,不管面向过程设计,还是基于对象设计;不管是面向对象编程,还是基于泛型编程,函数都可以随处而见。在谈论C++中的函数重载、覆盖和隐藏之前,先回顾下函数的基础知识。

函数的声明包括函数的返回值类型,函数名称,参数列表(参数的类型、参数的个数、参数的顺序)。例如,声明一个两个整数之和的函数,int iAdd(int iNum1,int iNum2);而函数的定义可以理解为对函数功能的详尽而准确的解说,通俗点,就是实现函数“how to do?”的效能。两个整数之和函数的定义如下:

int iAdd(int iNum1,int iNum2)
{
   return (iNum1+iNum2);
}

仔细观察函数的声明和定义,我们不难发现,函数的定义就是除掉函数声明后面的分号,换之成大括号,在大括号里面实现函数的功能。虽然在某些情况下,可以容许不对函数进行声明,只需要对函数定义,就能调用函数了。但是,强烈建议养成先声明函数,然后再定义函数,最后在调用函数的良好习惯。关于函数的基础知识,暂时论述到这。

现在,进入本文的主题。函数重载(function overload),它是在同一可访问区域内部声明具有几个不同参数列(参数的类型、参数的个数,参数的顺序)的相同函数名称的一种机制,函数的调用是根据不同的参数类型和最佳匹配原则确定最终使用那个函数。函数覆盖(function override)是在派生类中完全一致性地声明了父类中的函数,区别在于函数定义中的大括号之间的内容可以不同,并且该函数在父类中有关键字virtual标识;函数隐藏(function hide)是指在派生类中函数与父类函数完全一致,但是在父类中该函数没有关键字virtual标识,或者是指在派生类中函数与父类的函数名相同,参数列表不一样,父类中的该函数可有也可无关键字virtual标识。

函数重载的特征:相同的范围内(在同一个类中),函数的名称相同,参数列表不同,virtual关键字可有可无;函数覆盖的特征:在不同的范围内(父类与派生类),函数的名字相同,参数列表相同,父类函数必须有关键字virtual;函数隐藏的特征:在不同范围内(父类与派生类),函数的名字相同,参数列表相同,但是父类函数没有关键字virtual或者,参数列表不相同,父类函数中virtual关键字可有可无。

为了直观地理解,请看下面的代码。

#include<iostream>
using namespace std;
class A
{
public:
   void print(int iNum)
   {
     cout<<"在类A中,参数类型是整型"<<endl;
   }
   void print(float fNum)
   {
     cout<<"在类A中,参数类型是单精度浮点型"<<endl;
   }
 virtual void print(void)
   {
     cout<<"在类A中,参数类型是空类型"<<endl;
   }
};
class B:public A
{
public:
   void print( void)
   {
     cout<<"在类B中,参数类型是空类型"<<endl;
   }

   void print(int iNum)
   {
     cout<<"在类B中,参数类型是整型"<<endl;
   }
 };
int main()
{
   A a;
   B b;
  //函数的重载
   a.print();
   a.print(1);
   a.print(1.0f);
  //函数的覆盖
   b.print();
 //函数的隐藏
   b.print(1);
  return 0;
}

运行结果是:

   在类A中,参数类型是空类型
   在类A中,参数类型是整型
   在类A中,参数类型是单精度浮点型
   在类B中,参数类型是空类型
   在类B中,参数类型是整型

通过上述代码和运行的结果,简明地知道了函数重载,覆盖和隐藏。恰当里利用这些特性,可以编写出更加有效、清晰和精简的代码。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++中重载、重写(覆盖)和隐藏的区别实例分析

    本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念.具体分析如下: 1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 示例代码如下: class A{ public: void test(int i); void test(double i); void test(int i, double j); void te

  • C++中的重载、覆盖、隐藏介绍

    前几天面试时被问及C++中的覆盖.隐藏,概念基本答不上来,只答了怎么用指针实现多态,也还有遗漏.最终不欢而散.回来后在网上查找学习了一番,做了这个总结.其中部分文字借用了别人的博客,望不要见怪. •概念 一.重载(overload) 指函数名相同,但是它的参数表列个数或顺序,类型不同.但是不能靠返回类型来判断. (1)相同的范围(在同一个作用域中) : (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. (5)返回值可以不同: 二.重写(也称为覆盖 override)

  • 基于C++中覆盖,重载,隐藏的一点重要说明

    C++覆盖 重载 隐藏是三个经常容易混淆的概念 这里我们简单总结下: 1.重载的条件(编译时多态) a.同一个类中 b.函数名相同,参数不同(返回值不能作为重载的条件) c.与函数是否为虚函数无关 2.覆盖的条件(运行时多态) a.不同的类中,往往是一个继承体系 b.基类该函数为虚函数 c.派生类函数名相同,参数相同 3.隐藏的条件 a.不同的类中,往往是一个继承体系 b.1 若继承类中该函数名相同,参数不同,不管基类中该函数是否为虚函数,隐藏 b.2 若继承类中该函数名相同,参数相同,则只有当

  • C++概念重载、覆盖、隐藏的使用说明

    函数重载: 在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,即函数重载. 重载的实现: 几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自然想到函数接口的两个要素:参数与返回值.如果同名函数的参数不同(包括类型.顺序不同),那么容易区别出它们是不同的函数. 重载与覆盖成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别

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

    C++ 中函数重载.覆盖与隐藏详解 在C++语言中,函数扮演着很重要的角色,不管面向过程设计,还是基于对象设计:不管是面向对象编程,还是基于泛型编程,函数都可以随处而见.在谈论C++中的函数重载.覆盖和隐藏之前,先回顾下函数的基础知识. 函数的声明包括函数的返回值类型,函数名称,参数列表(参数的类型.参数的个数.参数的顺序).例如,声明一个两个整数之和的函数,int iAdd(int iNum1,int iNum2);而函数的定义可以理解为对函数功能的详尽而准确的解说,通俗点,就是实现函数"ho

  • javascript中函数的写法实例代码详解

    具体代码如下所述: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible

  • Go语言中函数可变参数(Variadic Parameter)详解

    目录 基本语法 示例一:函数中获取可变参数 示例二:将切片传给可变参数 示例三:多参数 基本语法 在Python中,在函数参数不确定数量的情况下,可以使用如下方式动态在函数内获取参数,args实质上是一个list,而kwargs是一个dict def myFun(*args, **kwargs): 在Go语言中,也有类似的实现方式,只不过Go中只能实现类似*args的数组方式,而无法实现**kwargs的方式.实现这种方式,其实也是利用数组的三个点表达方式,我们这里来回忆一下. 关于三个点(…)

  • C++中的覆盖和隐藏详解

    目录 1. 前言 2. 共性 3. 区别 4. 区分 5.参考文章 1. 前言 继承是面向对象编程的重要特性,在c++中,当父类与子类出现同名函数时,会出现两种情况:覆写和隐藏,本文主要讨论c++中这两种情况的特点和使用区别 2. 共性 当子类继承父类,并且子类中有父类同名函数,那么子类将隐藏父类中所有同名函数,不可以对父类中同名函数直接进行访问,此时子类调用父类中函数需要用域操作符:: #include<iostream> using namespace std; class A{ publ

  • C++函数重载介绍与原理详解

    目录 函数重载 函数重载的概念 函数重载的原理(名字修饰) 总结: extern “C” 函数重载 函数重载的概念 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表必须不同.函数重载常用来处理实现功能类似,而数据类型不同的问题. #include <iostream> using namespace std; int Add(int x, int y) { return x + y; } double Add(double x, doub

  • C++函数重载的细节图文详解

    前言:如果不想看论证,可以直接点击总结,跳转到最后 1.使用重载函数时,如果数据类型不匹配,C++尝试使用类型转换与形参进行匹配,如果转换后有多个函数能匹配上,编译器将报错: 论证如下: #include <iostream> using namespace std; void show(short no, string message) { cout << "short 亲爱的" << no << "号:" <

  • JavaScript中函数的防抖与节流详解

    目录 一.函数的节流 1.1定义 1.2解决方法 1.3案例演示 1.3.1 代码演示 1.3.2 运行结果 1.3.3 添加函数节流操作 1.3.4 运行结果 二.函数的防抖 2.1 定义 2.2 解决方法 2.3 案例演示 2.3.1 代码展示 2.3.2 运行结果 2.3.3添加函数防抖操作 2.3.4 运行结果 总结 一.函数的节流 1.1 定义 同时触发多次函数执行,执行的是相同内容,要求只执行第一次请求. 例如scroll事件,鼠标滚动一次触发多次函数执行,只需要执行一次. 1.2

  • C++子类父类成员函数的覆盖和隐藏实例详解

    C++子类父类成员函数的覆盖和隐藏实例详解 函数的覆盖 覆盖发生的条件: (1) 基类必须是虚函数(使用virtual 关键字来进行声明) (2)发生覆盖的两个函数分别位于派生类和基类 (3)函数名和参数列表必须完全相同 函数的隐藏 隐藏发生的条件: (1)子类和父类的函数名相同,参数列表可以不一样 看完下面的例子就明白了 #include "iostream" using namespace std; class CBase{ public: virtual void xfn(int

  • C++中函数重载实例详解

    C++中函数重载实例详解 函数重载: 1.具有相同的名称,执行基本相同的操作,但是使用不同的参数列表. 2.函数具有多态性. 3.编译器通过调用时参数的个数和类型确定调用重载函数的哪个定义. 4.只有对不同的数据集完成基本相同任务的函数才应重载. 函数重载的优 点 1.不必使用不同的函数名 2.有助于理解和调试代码 3.易于维护代码 接下来直接上代码: #include <iostream> using namespace std ; void say_hello(void) { cout &

  • C++中函数重载详解

    目录 函数重载的概念 函数重载的应用 为什么C++支持函数重载,而C语言不支持 函数重载的概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的 形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题. 函数重载的应用 1.比如以下代码,函数名一样,而参数的类型不同,在调用的时候编译器会根据传递的参数自动进行匹配. 2.在例如以下代码,我们进行编译,都可以编译成功. 3.接下来看一个有趣的现象,将上述第二个例子

随机推荐