重载、覆盖、隐藏

重载 覆盖 隐藏是C++中最为常见的几种函数相关的概念,特别是在存在虚函数的类继承中特别容易混淆。因此,区分三个概念是非常重要的。

1. 重载 (overload)

**函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

重载特征:

  • 在一个类中,相同的函数名,不同的参数,可以实现重载。跟返回值无关,返回值不同,不能叫做重载。;
  • 不是两个函数的名字相同就能构成重载;
  • 全局函数和类的成员函数同名也不算重载,因为函数的作用域不同;
  • virtual 关键字可有可无;

2. 重写(覆盖override)

可以实现既有共同特征又需要在不同的基类里有不同的实现的方法。只需要在类里重新声明这个方法,然后再改写一下它的实现代码。

派生类函数覆盖基类函数,即虚函数的继承的时候发生的。
而且发生在不同的范围内,基类和子类。函数前必须有virtual。而重载有没有virtual无所谓。而且函数名字和参数必须相同。如果参数不同,就是隐藏,不是重载。
覆盖的特征

  • 不同的范围,分别位于基类和派生类中;
  • 函数的名字相同,参数相同;
  • 基类函数必须要有virtual关键字;

3. 隐藏hide (重定义)

隐藏发生在继承时候。如果基类的函数不是virtual,子类又重新定义了该函数,无论参数相同不相同都是隐藏。如果是virtual 函数, 参数相同就是覆盖,参数不同就是隐藏。

  • 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
  • 如果派生函数与基类函数的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的被隐藏。

你可能感兴趣的:(重载、覆盖、隐藏)