广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++函数重载、隐藏与覆盖重写的方法是什么
  • 785
分享到

C++函数重载、隐藏与覆盖重写的方法是什么

2023-06-29 00:06:31 785人浏览 安东尼
摘要

这篇文章主要介绍了c++函数重载、隐藏与覆盖重写的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载、隐藏与覆盖重写的方法是什么文章都会有所收获,下面我们一起来看看吧。1 函数重载定义:C+

这篇文章主要介绍了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.cpproot@localhost override [master] $ ./a.outthis 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.cpproot@localhost override [master] $ ./a.outthis is Son Override Parent function

附:令人迷惑的隐藏规则

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

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

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

关于“C++函数重载、隐藏与覆盖重写的方法是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++函数重载、隐藏与覆盖重写的方法是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++函数重载、隐藏与覆盖重写的方法是什么

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

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

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

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

下载Word文档
猜你喜欢
  • C++函数重载、隐藏与覆盖重写的方法是什么
    这篇文章主要介绍了C++函数重载、隐藏与覆盖重写的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载、隐藏与覆盖重写的方法是什么文章都会有所收获,下面我们一起来看看吧。1 函数重载定义:C+...
    99+
    2023-06-29
  • C++函数重载、隐藏与覆盖重写的精通指南
    前言 对于C++函数而言,多个函数如果同名会有很多有意思的事情,从声明的作用域来看,在横向上同一个可访问作用域里面的同名函数可以进行重载;而纵向上作用域对于父子继承的派生类来说,同样...
    99+
    2022-11-13
  • C++成员函数的重载,继承,覆盖和隐藏是什么
    这篇文章主要介绍“C++成员函数的重载,继承,覆盖和隐藏是什么”,在日常操作中,相信很多人在C++成员函数的重载,继承,覆盖和隐藏是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++成员函数的重载,继承...
    99+
    2023-06-17
  • C#中隐藏、重写、重载的区别是什么
    这篇文章主要讲解了“C#中隐藏、重写、重载的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中隐藏、重写、重载的区别是什么”吧!C#重载、C#重写和C#隐藏的定义C#重载:同一个...
    99+
    2023-06-17
  • C++覆盖和重载的区别是什么
    这篇文章主要讲解了“C++覆盖和重载的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++覆盖和重载的区别是什么”吧!1、覆盖覆盖也称为重写(override)。覆盖是存在类中,子...
    99+
    2023-06-16
  • C# 中override重写与new隐藏的区别是什么
    这期内容当中小编将会给大家带来有关C# 中override重写与new隐藏的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#比java多一个new隐藏的功能。C# override重写相当于j...
    99+
    2023-06-17
  • C++中函数重载定义与原因是什么
    小编给大家分享一下C++中函数重载定义与原因是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引例如果要求你只能通过print函数,即能打印字符串,又能打印一个整型。虽然在C语言中我们可以通过 print_i 和prin...
    99+
    2023-06-29
  • Java和JVM的重载和重写方法是什么
    本文小编为大家详细介绍“Java和JVM的重载和重写方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java和JVM的重载和重写方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.案例void&...
    99+
    2023-06-28
  • c++运算符重载的方法是什么
    C++中的运算符重载方法是通过定义特殊的成员函数来实现的。重载运算符的函数被称为运算符函数,它们具有特殊的命名规则和语法。一般情况下...
    99+
    2023-09-14
    c++
  • c++赋值运算符重载的方法是什么
    C++中赋值运算符重载的方法是通过重载赋值运算符(=)来实现的。赋值运算符重载允许在自定义类中使用赋值运算符进行对象之间的赋值操作。...
    99+
    2023-10-11
    c++
  • 重定向 leetcode 函数:Python 的实现方法是什么?
    重定向是一种将程序的输出从标准输出流(通常是终端)转换到另一个输出流的方法。在Python中,我们可以使用sys模块中的函数来实现重定向。在本文中,我们将讨论如何在Python中实现重定向LeetCode函数。 LeetCode是一个非常流...
    99+
    2023-06-30
    重定向 leetcode 函数
  • c语言函数的定义与调用方法是什么
    C语言函数的定义和调用方法如下:1. 函数的定义:在C语言中,函数的定义包括函数的返回类型、函数名、参数列表和函数体。函数的定义一般...
    99+
    2023-08-18
    c语言
  • C++右值引用与移动构造函数应用的方法是什么
    这篇文章主要讲解了“C++右值引用与移动构造函数应用的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++右值引用与移动构造函数应用的方法是什么”吧!1.右值引用右值引用是 C++...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作