C++继承之 重载 、覆盖、隐藏

在C++ 继承中经常会遇到函数重载、覆盖、隐藏这三个玩意,但是这三者的本质区别又是什么,自己在网上和资料里查后并通过代码证实,下面我们看看者三者的本质:
1、重载:
重载是C++独有的一个特性,C下面是没有的,具体分析请看:http://blog.csdn.net/magiclyj/article/details/71081288.
这里我们来具体看看重载,重载特点:
1)在同一范围
2)函数名相同
3)参数不同
4)返回值可以相同也可以不同
5)有无virtaul都可以
这里写图片描述
运行结果:
这里写图片描述
虽然是同名同返回值,但是参数的不同条用的函数还是不同的。
2、覆盖:
1)覆盖是在继承中存在的,
2)两个函数分别在基类和派生类中
3)这里两个函数函数名、参数类型和参数类型顺序、函数返回值类型都必须相同,
4)而且父类中的函数必须加virtual,
5)只有父类指针指向子类对象或者父类对象引用子类对象才能使用
这里写图片描述
在代码中加了通过作用域找基类被覆盖的函数。
运行结果:
这里写图片描述

3、隐藏:
前面区别重载和覆盖通过他们的特性我们发现还是比较容易的,但是如果加了隐藏就不是那么容易了,三者很容易混淆:
1)如果父类函数和子类的函数同名,但是参数不同,不管有没有virtual关键字,基类的函数将被隐藏(别与重载混淆,这是在不同范围里的)
2)如果子类的函数和父类的函数同名,且参数类型和参数类型顺序相同,但是父类没有virtaul关键字。这时父类的函数同样被子类的函数隐藏(别和覆盖混淆,没有virtual)

这里写图片描述
运行结果:
这里写图片描述
我们把这三个类型糅杂在一起看一下:
这里写图片描述
运行结果:
这里写图片描述

案例分析后我们总结一下:
重载和覆盖去区别是:

      相同点:函数名相同
      不同点:范围、参数类型和参数类型顺序,覆盖必须有virtual关键字。

重载和隐藏规则1:

       相同点:函数名
       不同点:范围不同

覆盖和隐藏规则2:

       相同点:函数名、函数参数类型和函数参数类型顺序都必须。
       不同点:关键字virtual.

猜你喜欢

转载自blog.csdn.net/magiclyj/article/details/77344535
今日推荐