重载、重定义、重写(覆盖)、隐藏的定义与区别

阅读: 评论:0

重载、重定义、重写(覆盖)、隐藏的定义与区别

重载、重定义、重写(覆盖)、隐藏的定义与区别

今天在学习Java中《类和对象》这一章时,我看到了熟悉的重载和重定义,突然想到自己在学习C++时也遇到过这些概念,而且当时还没搞懂,仔细一想,我好像现在也没搞懂。

于是我立马扔下手中的Java,离开自习室,在CSDN上查询这两个概念的区别,这不查不知道,一查吓一跳,我又碰到一个非常熟悉的大兄弟----重写,和从未听过的一个老哥们----隐藏。

这四个混在一起。完了,更懵了。

 但是功夫不负有心人啊,还是让孩子搞懂了这几个玩意,我可真是个小天才!

那我们来看下这四个概念的定义以及区别吧       GO  GO GO!!!

一、重载

何为重载呢?其实就是指在同一作用域下,有一组具有相同函数名,不同参数表的函数,这组函数被称为重载函数(也有的地方说是一组具有相同方法名,不同参数表的方法,这组方法被称为重载方法)

我们来浅谈一下函数和方法的区别。其实非常的简单!

面向对象的语言叫方法

面向过程的语言叫函数

其实方法就是函数,函数就是方法,只是在不同的语言不同的称呼而已。这里我们就统一叫函数了

我们来举个重载函数的小例子 

//函数1
int add(int a, int b){}
//函数2
double add(double a, double b){}
//函数3
int add(int a, int b,int c){}

函数1和函数2是重载函数,因为这两个函数的函数名一致,参数列表中的变量数目相同,但它们的参数类型不同,函数1中的参数列表是两个int型的变量,函数2的参数列表是两个double型的变量,所以这两个函数是重载函数

函数1和函数3也是重载函数,因为这两个函数的函数名一致,参数列表中的变量类型相同,但它们的变量数目不同,函数1中的参数列表是两个int型的变量,函数3的参数列表是三个int型的变量,所以这两个函数是重载函数

那么函数2和函数3是不是重载函数呢?这里我们给大家留一些思考的空间,这个问题会在下面的博客中得到解答

二、重定义

 重定义就是在同一作用域下,有一组具有相同函数名,相同参数表,不同函数类型的函数,这组函数被称为重定义函数

下面的两个函数就是重定义函数

PS:重定义函数编译时会给出错误信息

//函数1
int sum(int a, int b){}
//函数2
double sum(int a,int b){}

 ​​接下来我们来点有挑战性的,大家来给下面的四个函数分个组,看看哪些函数是重载函数,哪些函数是重定义函数

//函数1
​​int add(int a, int b){}
//函数2
int add(int a, double b, int c) {}
//函数3
double add(int a, int b){}
//函数4
double add(double a, double b){}

 可能大家会有点懵懵的,那我们来讲解一下判断重载函数的小法则

重载函数是通过参数的类型不同或者参数个数不同来区分的,不能通过参数名和函数类型来区分

我们先看哪些函数的参数列表中的变量个数和变量类型完全一致,仔细一瞅

Oh不,你这个人脸熊猫凶人家,我不管,我就要瞅!哼!

可以看到,只有函数1和函数3的中的参数列表完全一样,再看他们的函数名,也是一样的,说明这两个函数就是重定义函数,再看函数2和函数4,这四个函数的函数名都是add,函数2和函数4的参数列表和函数1不一样,函数2和函数4的参数列表和函数3也不一样,所以我们得出结论:

函数1、函数2、函数4是重载函数

函数2、函数3、函数4是重载函数

函数1、函数3是重定义函数

相信大家对重载函数和重定义函数有了清晰的概念了,接下来我们看函数重写和函数隐藏了。

顺带说一句,相信你在了解完重写和重定义的概念后,也知道咱们上面提到的那个函数2和函数3也是重写函数哦。wink!

三、重写(覆盖)

首先我们说一下,我们这里把派生类称为子类,基类称为父类,便于大家理解,大家看别的博客有的可能说的是基类和派生类,大家别迷糊了。

什么是重写呢?重写就是指在子类中重新对父类中的虚函数(注意是虚函数)重新实现。即函数名和参数列表都一样,只是函数的实现体不一样

虚函数就是在函数类型前面加上virtual,如:virtual void sum(int a);

我们来看下面的例子,这个例子实现的就是子类对父类中的Func函数进行重写

#include<iostream>
using namespace std;class CFather
{
public:int a;int b;
public:virtual int Func(int a, int b){cout << "调用的是父类中的Func函数,结果为" ;cout << a + b << endl;return a + b;}
};class CSon:public CFather
{
public:int a;int b;
public:int Func(int a, int b){cout << "调用的是子类中的Func函数,结果为" ;cout << a * b << endl;return a * b;}
};int main()
{CSon son;CFather father;int a;int b;cout << "请输入a和b的大小" << endl;cin >> a >> b;son.Func(a, b);father.Func(a, b);system("pause");return 0;
}

输入:

请输入a和b的大小
2 4

输出:
调用的是子类中的Func函数,结果为8
调用的是父类中的Func函数,结果为6

四、隐藏

所谓的隐藏,指的是子类中的对象、指针、引用访问父类和子类都有的同名且参数列表相同的函数时,访问的是子类的函数,即隐藏了父类的同名函数。

还是上面的小例子,不过我们去掉那个virtual再来运行一遍

#include<iostream>
using namespace std;class CFather
{
public:int a;int b;
public:int Func(int a, int b){cout << "调用的是父类中的Func函数,结果为" ;cout << a + b << endl;return a + b;}
};class CSon:public CFather
{
public:int a;int b;
public:int Func(int a, int b){cout << "调用的是子类中的Func函数,结果为" ;cout << a * b << endl;return a * b;}
};int main()
{CSon son;CFather father;int a;int b;cout << "请输入a和b的大小" << endl;cin >> a >> b;son.Func(a, b);father.Func(a, b);system("pause");return 0;
}

输入:

请输入a和b的大小
2 4

输出:
调用的是子类中的Func函数,结果为8
调用的是父类中的Func函数,结果为6

肯定有人会好奇,啊这这这,这重写和隐藏有啥不同啊,不就是一个父类函数是虚函数,一个父类函数不是虚函数吗?你看看这结果,你看看这代码,简直就像一个妈生的,有啥子区别。那确实,这俩代码都是我写的,可不就是一个妈生的。给你来手奥利给!

 我们这里只是举了一个最简单的例子

其实如果你想要在子类中重写父类的虚函数的话,你的函数名,参数列表,函数类型,都必须一模一样,且只能重写父类中唯一对应的那一个函数

比如父类中的虚函数为

virtual  int Func(int a, double b, char c)

子类中名为Func的函数有三个

① int Func(int a, char   yi

② double Func(int a, double b, char c)

③ int Func(int a, double b, char c)

这里只有第三个子类函数能重写父类的虚函数,原因如上所述

而你想要隐藏父类中的函数的话,只要函数名一致就可以了,比如我们之前写的Func函数,父类中的Func函数为int Func(int a, int b),子类中的函数只要名字一致就可以了,比如

char Func(int a, int b)

int Func()

int Func(double a, int b, char c, float d)

double Func(double a)

这些函数都可以隐藏父类中的函数

同时,重写只能够重写父类中唯一对应的那个函数,而隐藏可以隐藏掉父类中所有同名的函数

比如:

我们在父类中写了三个同名的函数

父类:

char Func(int a, int b)

int Func()

int Func(double a, int b, char c, float d)

而子类中只需要随便写一个同名函数就可以隐藏掉父类中所有与该函数同名的父函数

如:double Func(double a)

好累啊,写这篇文章还真花了不少时间

今天的学习记录到此结束啦,咱们下篇文章见,ByeBye!                                                  

本文发布于:2024-02-05 04:12:37,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170723839362955.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:定义   重写   区别
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23