iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++函数重载、隐藏与覆盖重写的精通指南
  • 591
分享到

C++函数重载、隐藏与覆盖重写的精通指南

2024-04-02 19:04:59 591人浏览 八月长安
摘要

前言 对于c++函数而言,多个函数如果同名会有很多有意思的事情,从声明的作用域来看,在横向上同一个可访问作用域里面的同名函数可以进行重载;而纵向上作用域对于父子继承的派生类来说,同样

前言

对于c++函数而言,多个函数如果同名会有很多有意思的事情,从声明的作用域来看,在横向上同一个可访问作用域里面的同名函数可以进行重载;而纵向上作用域对于父子继承的派生类来说,同样的函数名称可以实现隐藏与覆盖。(如果基类成员函数是虚函数,可以基于虚函数实现多态,进行动态联编)下面就详细介绍下函数的重载、隐藏与覆盖重写。

1 函数重载

  • 定义:

C++规定在同一作用域中,例如一个类的成员函数之间,多个函数的名称相同,但是各个函数的形式参数(指参数的个数、类型或者顺序)不同时,构成函数重载。

  • 代码示例
int test(int a);
int test(int a, double b);
int test(double b, int a);
int test(int a, const char ** c); 
void test(int a, const char ** c); 		  // 非重载,一起编译会提示错误,仅仅返回值不同编译无法区分使用的是那个重载函数
  • 前提:函数名称相同,即要求是同名函数;
  • 重载作用域:函数重载发生在横向水平的同一作用域,例如一个类成员函数之间的重载、全局函数之间的重载;
  • 重载类型:无论是类的静态成员函数,还是类的普通成员函数,亦或是普通的函数,都可以形成重载;
  • 重载要素:函数返回值类型函数重载无任何关系,仅仅返回值不同,形参相同的情况,会被禁止重载;

2 函数隐藏

  • 定义

函数隐藏是说,在不同作用域中,定义的同名函数构成函数隐藏(仅仅要求函数名称相同,对于返回值和形式参数不做更多要求,并且对于是否是虚函数也不做要求)。例如派生类同名成员函数屏蔽与其基类的同名成员函数,以及屏蔽同名全局外部函数。(经常有人隐藏和覆盖重写弄混,所以提前说下,如果在派生类中存在与基类同名的虚函数,并且返回值、形参都相同,则构成函数重写)。

  • 代码示例
#include <iOStream>

using namespace std;

class Parent
{
  public:
    void test(int a) {
      cout<<"this is Parent"<<endl;
    }
};

class Son: public Parent
{
  public:
    void test(int a) {
      cout<<"this is Son hide Parent function"<<endl;
    }
};

int main(int arGC, char ** argv) {
  Son son;
  son.test(1);
  return 0;
}

​ 输出如下

root@localhost override [master] $ g++ --std=c++11 test_hide.cpp
root@localhost override [master] $ ./a.out
this is Son hide Parent function
  • 总结
  • 前提:函数名称相同,即要求是同名函数;
  • 作用域:不在同一个横向的作用域(分别位于派生类与基类的纵向作用域);
  • 要素:返回类型可同可不同,参数亦可同可不同;
  • 虚函数:

    参数不同,此时无论有无virtual关键字,基类的函数将被隐藏;

    参数相同的情况下

    此时基类函数无virtual则属于函数隐藏,后续无法继续基于此利用这个函数的多态性;

    如果是virtual则属于函数重写,继续多态性的保留;

3 函数重写

  • 定义

函数的覆盖和重写是一个意思的两个叫法,同时他的作用域也和函数隐藏相同,其实可以这么看,函数覆盖和函数隐藏共同构建了在具有集成关系的纵向作用域里面的同名函数的不同衍变,只不过函数覆盖的条件更加严格些。

在介绍函数隐藏的时候,为了弄清楚函数隐藏与覆盖重写,也简单描述了函数覆盖。这里再进一步进行描述下:派生类中与基类中,同名函数的返回值类型、参数的都相同,并且基类中定义为虚函数的情况下,构成虚函数覆盖,也叫虚函数重写。

  • 代码示例
#include <iostream>
using namespace std;
class Parent
{
  public:
    virtual void test(int a) {
      cout<<"this is Parent"<<endl;
    }
};

class Son: public Parent
{
  public:
    void test(int a) {
      cout<<"this is Son Override Parent function"<<endl;
    }
};

int main(int argc, char ** argv) {
  Son son;
  son.test(1);
  return 0;
}

输出如下:

root@localhost override [master] $ g++ --std=c++11 test_override2.cpp
root@localhost override [master] $ ./a.out
this is Son Override Parent function

附:令人迷惑的隐藏规则

C++的隐藏规则使问题复杂性陡然增加,这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

总结

咋一看,感觉重写的功能基于隐藏是都可以实现,那么为什么要区分重写和隐藏呢?其实这是C++语言层面的问题了,C++基于virtual函数实现了多态性,并且可以进行动态联编,但是隐藏其实是破坏了这种多态性,也就是说父类成员函数的virtual性,在被子类成员函数的隐藏破坏后,无法传递给孙子类了,所以还需要重写来遗产的家族传递。

  • 前提:函数名称相同,即要求是同名函数;
  • 作用域:不在同一个横向的作用域(分别位于派生类与基类的纵向作用域);
  • 要素:返回类型可同可不同,参数亦可同可不同;
  • 是否虚函数:前提是虚函数,并且参数相同;

到此这篇关于C++函数重载、隐藏与覆盖重写的文章就介绍到这了,更多相关C++函数重载、隐藏与覆盖重写内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++函数重载、隐藏与覆盖重写的精通指南

本文链接: https://www.lsjlt.com/news/163766.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++函数重载、隐藏与覆盖重写的精通指南
    前言 对于C++函数而言,多个函数如果同名会有很多有意思的事情,从声明的作用域来看,在横向上同一个可访问作用域里面的同名函数可以进行重载;而纵向上作用域对于父子继承的派生类来说,同样...
    99+
    2024-04-02
  • C++函数重载、隐藏与覆盖重写的方法是什么
    这篇文章主要介绍了C++函数重载、隐藏与覆盖重写的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载、隐藏与覆盖重写的方法是什么文章都会有所收获,下面我们一起来看看吧。1 函数重载定义:C+...
    99+
    2023-06-29
  • 浅析C++中的重载,隐藏和覆盖
    重载关系 一组函数要重载,必须处在同一个作用域中 ,而且函数名字相同,参数列表不同 代码1中的Base中的 show() 和show(int) 属于重载 代码2中的Base中的 sh...
    99+
    2022-12-08
    C++重载 隐藏 覆盖 C++重载 C++ 隐藏 C++ 覆盖
  • C++ 函数的重载和覆盖
    c++++ 中重载和覆盖是不同的概念。重载允许创建同名函数,具有不同的参数列表,而覆盖允许派生类函数覆盖基类同名函数。在重载中,函数名相同,但参数列表不同,在覆盖中,函数名和参数列表必须...
    99+
    2024-04-12
    重载 覆盖 c++
  • C++成员函数的重载,继承,覆盖和隐藏是什么
    这篇文章主要介绍“C++成员函数的重载,继承,覆盖和隐藏是什么”,在日常操作中,相信很多人在C++成员函数的重载,继承,覆盖和隐藏是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++成员函数的重载,继承...
    99+
    2023-06-17
  • C++ 中的函数重载和函数覆盖
    c++++ 中,函数重载允许创建具有相同名称但不同参数列表的函数。函数覆盖发生在派生类中,派生类中定义的函数与基类中同名函数覆盖基类的方法。 C++ 中的函数重载和函数覆盖 引言 函数...
    99+
    2024-04-14
    函数重载 函数覆盖 c++
  • C++深入探究重载重写覆盖的区别
    目录基类实现子类实现函数调用总结资源链接基类实现 我们先实现一个基类 class BaseTest { private: virtual void display() { c...
    99+
    2022-11-13
    C++ 重载 C++ 重写 C++ 覆盖
  • C++ 函数重写详解:覆盖父类函数的奥妙
    c++++ 的函数重写允许子类覆盖父类的函数,提供自己的特定实现。子类需要声明一个与父类同名、同参数类型的函数,并使用 override 关键字标记。重写函数可以用于扩展父类功能、为子类...
    99+
    2024-05-04
    c++ 函数重写
  • C+继承之同名覆盖,函数重写与多态详解
    目录同名覆盖函数重写多态总结如果父类成员和子类成员名字相同是否允许?会发生什么? 同名覆盖 #include<iostream> using namespace st...
    99+
    2024-04-02
  • C++填坑的重写,重载和隐藏的详解
    目录重写重载隐藏总结重写 重写的定义:重写发生在基类和派生类的继承关系之中,被定义为虚函数的基类成员函数,由派生类进行重新定义和实现,同时隐藏掉基类的方法(即派生类调用该重...
    99+
    2024-04-02
  • C#中隐藏、重写、重载的区别是什么
    这篇文章主要讲解了“C#中隐藏、重写、重载的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中隐藏、重写、重载的区别是什么”吧!C#重载、C#重写和C#隐藏的定义C#重载:同一个...
    99+
    2023-06-17
  • C++ 函数重写:揭开继承中的行为覆盖秘籍
    当派生类定义同名且实现不同的函数时,发生函数重写。规则包括:使用 override 关键字。名称、参数和返回类型与基类函数相同。访问权限不得低于基类函数。通过重写,派生类可以覆盖基类行为...
    99+
    2024-04-30
    c++ 函数重写
  • C++ 函数重载与重写的异同分析
    函数重载和重写的异同点:相同点:提供函数的多组变体,名称重用简化代码。不同点:作用域:重载在同一作用域,重写在不同作用域。参数或返回类型:重载参数类型不同,重写允许参数类型或返回类型不同...
    99+
    2024-04-21
    c++ 函数重载 函数重写 作用域
  • C++ 函数重载与重写有何区别?
    c++++ 函数重载与重写:重载:同名函数具有不同的参数类型或数量,编译时选择合适版本。重写:派生类中与基类同名函数,覆盖基类实现,提供派生类特定实现。重载特征:参数类型或数量不同,编译...
    99+
    2024-04-13
    c++ 函数重载 函数重写 作用域
  • C++ 函数重写:覆盖父类缺陷,优化代码结构
    函数重写允许子类覆盖父类函数,从而解决父类缺陷和优化代码结构。具体步骤如下:子类重写父类具有相同名称和签名的函数,提供自己的实现。子类可以纠正父类设计缺陷或错误。重写函数可以改善代码的可...
    99+
    2024-05-02
    c++ 函数重写
  • C++ 函数重载和重写中的虚函数与动态绑定
    函数重载和重写:函数重载允许在同一类中创建具有不同参数列表的同名函数,而函数重写是在继承关系中用子类覆盖基类的同名函数。虚函数和动态绑定:虚函数允许子类以自己的方式实现父类方法,并在函数...
    99+
    2024-04-20
    函数重载 虚函数 c++
  • C++Lambda 表达式与函数重载和重写的交互
    lambda 表达式在 c++++ 中与函数重载和重写交互,提供灵活和可重用的代码。lambda 表达式可以充当重载函数,允许使用具有相同名称但参数不同的 lambda 表达式;也可以用...
    99+
    2024-04-20
    c++ lambda 作用域
  • C++ 函数重载和重写中引用和指针的处理
    函数重载时,传递引用或指针,所有函数必须使用相同类型的数据。函数重写时,对于引用成员函数,子类函数必须引用同一类型变量;对于指向成员函数,子类函数必须指向同一类型变量。 C++ 函数重...
    99+
    2024-04-20
    函数重载 引用指针处理 c++ 作用域
  • C# 中override重写与new隐藏的区别是什么
    这期内容当中小编将会给大家带来有关C# 中override重写与new隐藏的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#比java多一个new隐藏的功能。C# override重写相当于j...
    99+
    2023-06-17
  • C++ 函数重载和重写的理解和使用
    c++++ 中函数重载允许在同一类中定义同名函数,但参数列表不同;函数重写发生在子类中定义一个与父类同名且参数相同的函数,子类函数将覆盖父类函数。实战示例中,重载函数用于针对不同数据类型...
    99+
    2024-04-20
    函数重载 函数重写 c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作