C++菜鸟进阶——>关于重载、隐藏和重写

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++成长的动力,我一定会加油的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值