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(我马上就列代码演示),看对比表
隐藏 | 重写 | |
基类派生类 | √ | √ |
函数名相同 | √ | √ |
参数列表 | × | √ |
返回值 | × | √ |
基类函数加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++成长的动力,我一定会加油的。