1、重载(overload)
重载的概念是在同一作用域内,函数名相同,函数输入参数个数、数据类型不同,但是不能是函数名、参数个数、数据类型完全相同但返回值不同的情况。最直接的例子是常见的构造函数重载,在写一个类的时候可能会出现多个构造函数,每个构造函数的输入参数是不一样的,有无输入参数的默认构造函数,也有带参的构造函数。
所以,重载的特点总结为:
-
在同一作用域(比如同一类中的成员函数);
-
函数名相同;
-
参数列表不同(参数个数或者参数数据类型)
-
virtual关键字可有可无。
2、重写(overrid)
重写也叫覆盖,重写要求子类继承父类的virtual修饰的方法并重写函数定义,这个一般情况都要求函数名、返回值和参数列表必须完全相同。关于返回值,可以是这几种情况:
-
与基类的虚函数有相同的返回类型;
-
或者与基类虚函数的相同;
-
或者都返回指针(或引用),并且派生类虚函数所返回的指针(或引用)类型是基类中被替换的虚函数所返回的指针(或引用)类型的子类型(派生类型)。
所以,重写的特点可以归纳为:
-
不同作用域(子类和父类);
-
函数完全一样(一样的函数名、返回值和参数列表);
-
父类的函数声明必须用virtual修饰;
关于重写还有个可能不太一般的情况,就是子类重写了父类虚函数,函数名和参数列表都一样,但是返回值不一样,比如父类返回的是父类的指针或者引用,子类返回的是子类的指针或者引用,这个情况叫协变,这个也属于重写。
3、隐藏(hide, oversee)
隐藏跟重载和重写有点混淆,但是不一样。隐藏是子类与将父类的成员函数同名,将父类的成员函数屏蔽,出现屏蔽的条件是:
-
子类和父类函数的参数列表相同,但是父类的成员函数没有virtual修饰(这个对比重写);
-
子类和父类函数的参数列表不同,这时不管父类的函数是不是虚函数都屏蔽(这个对比重载);
关于重写涉及到一个虚函数的概念,这一篇不讲,下一篇再介绍。
悲歌可以当泣,
远望可以当归。
思念故乡,
郁郁累累。
欲归家无人,
欲渡河无船。
心思不能言,
肠中车轮转。