C++菜鸟进阶——>关于重载、隐藏和重写
2018-03-27 15:04
375 查看
1. 什么是重载,什么时候用重载?
首先得在一个类中,其次函数名要相同,然后参数列表不同,最后不管返回值。以下是测试代码:
看到没有,debug报错,说 int test(int x)和void test(int x)无法重载,说明重载跟返回值是无关的。
你看随便屏蔽一个就好了。
重载的实际开发应用:针对重载的特性,函数名相同,参数不同,可以根据你自己输入的参数形式来确定具体调哪个函数,从而完成不同的操作。因为重载很好理解,我就不多做解释。
2. 什么是隐藏,隐藏怎么用?
首先是在基类和派生类中,其次函数名相同,然后派生类会把基类函数隐藏掉。看以下代码:
主要是f2( )的函数体,以B的对象b调用继承过来的test( )函数是报错,它说没有B::test( )匹配的函数,此处正好说明test被隐藏了,同理A中的int test(int x)同样被隐藏了,所以此处应该调用float test(float x)这个函数,这个很好理解,不过请注意隐藏并不是指把基类函数擦除了,要想在B类中确实想访问A类被隐藏函数的话可以在函数前面加类名,就可以访问。
你看,这就编译成功了。
3.什么是重写(覆盖),重写要怎么用?
首先在基类和派生类中,函数名相同,参数列表相同,返回值相同,函数体那是不相同的(相同的话为啥要重写直接继承不就好了),最后基类加一个virtual(我马上就列代码演示),看对比表
举例代码:
这里void test( )和virtual int test(int x)都是重写的,在f1( )函数中,指针p对于重写有个定律:如果p调用的是普通函数,则看指针本身的作用域在哪里;如果要调用的是虚函数(virtual),则看指针所指向的是哪个类。所以这里p->test(),可知道p是A类,所以这里的test( )是A类中的test( );p->test(10),因为这个是虚函数,所以看p指向的地方,此处是B类对象,所以此处的test(10)是来自B类的。
对于f2( )的引用是相同的道理,前面说过因为引用在底层就是一种受限指针,所以引用在此处同样适用。
对于f3( )本来就是B类,调自己的函数本来就没问题。
下图我把B类(派生类)int test (int x)函数去掉了virtual,其结果还是一样的。
但是当我如图改变时:
那么上图的int test (int x)就不是重写,就是隐藏了,因为p(在类A中)调用的是普通函数,所以直接看p的作用域,此处是类A的int test(int x),引用同理。
读了以上文章的相信您肯定有了些许收获,您的理解是我C++成长的动力,我一定会加油的。
首先得在一个类中,其次函数名要相同,然后参数列表不同,最后不管返回值。以下是测试代码:
看到没有,debug报错,说 int test(int x)和void test(int x)无法重载,说明重载跟返回值是无关的。
你看随便屏蔽一个就好了。
重载的实际开发应用:针对重载的特性,函数名相同,参数不同,可以根据你自己输入的参数形式来确定具体调哪个函数,从而完成不同的操作。因为重载很好理解,我就不多做解释。
2. 什么是隐藏,隐藏怎么用?
首先是在基类和派生类中,其次函数名相同,然后派生类会把基类函数隐藏掉。看以下代码:
主要是f2( )的函数体,以B的对象b调用继承过来的test( )函数是报错,它说没有B::test( )匹配的函数,此处正好说明test被隐藏了,同理A中的int test(int x)同样被隐藏了,所以此处应该调用float test(float x)这个函数,这个很好理解,不过请注意隐藏并不是指把基类函数擦除了,要想在B类中确实想访问A类被隐藏函数的话可以在函数前面加类名,就可以访问。
你看,这就编译成功了。
3.什么是重写(覆盖),重写要怎么用?
首先在基类和派生类中,函数名相同,参数列表相同,返回值相同,函数体那是不相同的(相同的话为啥要重写直接继承不就好了),最后基类加一个virtual(我马上就列代码演示),看对比表
隐藏 | 重写 | |
基类派生类 | √ | √ |
函数名相同 | √ | √ |
参数列表 | × | √ |
返回值 | × | √ |
基类函数加virtual | × | √ |
这里void test( )和virtual int test(int x)都是重写的,在f1( )函数中,指针p对于重写有个定律:如果p调用的是普通函数,则看指针本身的作用域在哪里;如果要调用的是虚函数(virtual),则看指针所指向的是哪个类。所以这里p->test(),可知道p是A类,所以这里的test( )是A类中的test( );p->test(10),因为这个是虚函数,所以看p指向的地方,此处是B类对象,所以此处的test(10)是来自B类的。
对于f2( )的引用是相同的道理,前面说过因为引用在底层就是一种受限指针,所以引用在此处同样适用。
对于f3( )本来就是B类,调自己的函数本来就没问题。
下图我把B类(派生类)int test (int x)函数去掉了virtual,其结果还是一样的。
但是当我如图改变时:
那么上图的int test (int x)就不是重写,就是隐藏了,因为p(在类A中)调用的是普通函数,所以直接看p的作用域,此处是类A的int test(int x),引用同理。
读了以上文章的相信您肯定有了些许收获,您的理解是我C++成长的动力,我一定会加油的。
相关文章推荐
- 关于C++中的重载、重写(覆盖)、隐藏
- c++ --> 重载、重写(覆盖)和隐藏的区别
- C++进阶—>函数重载、重写、重定义的区别
- [C/C++]关于C++类成员函数的重载、覆盖、隐藏与virtual关键字
- 01-C++中重载、重写(也称覆盖)、隐藏
- C++中重载、重写(覆盖)和隐藏的区别
- c++多态、重写、覆盖、隐藏、重载
- c++ 重载、重写、重定义(隐藏)
- C++中关于指针运算符->的重载问题
- C++中重载、重写(覆盖)和隐藏的区别
- [C/C++]关于C++类成员函数的重载、覆盖、隐藏与virtual关键字
- C++中的覆盖(重写)、重载、隐藏(重定义)、多态!
- <C++略识>之重载、覆盖、隐藏
- c++中的隐藏、重载、覆盖(重写)
- C++函数名字的隐藏:重写、重载、重定义
- C++基础:虚函数、重载、覆盖、隐藏<转>
- C++中重载、重写(覆盖)和隐藏的区别实例分析
- C++重载、重写(覆盖)和隐藏
- C++中重载,重写(覆盖),隐藏 与 多态性
- C++中重定义、重写、重载的区别以及隐藏与覆盖的访问