-
- 重载
- 在同一个作用域内
- 函数名相同
- 参数不同,可以是数量或类型
- 其他因素:
- virtual、static不影响重载
- 返回值类型不同不影响重载
- 部分函数类型限定符,如写在成员函数参数列表后的const,影响重载
- 示例:
-
-
class A { public: void f(int) {} void f(float) {} void f(int) const {} void f(int, int) {} //int f(int){} //virtual void f(int) {} };
-
-
- 覆盖
- 不在同一作用域,即分别位于子类和父类中
- 函数名相同
- 参数相同,返回值相同
- 父类中函数前必须有virtual关键字
- 示例
-
class A { public: virtual void f(int) {} }; class B : public A { public: void f(int) {} };
-
- 隐藏
- 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual 关键字,基类的函数将被隐藏(注意别与重载混淆).
- 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏.
- 示例
-
class A { public: virtual void f(int) {} void g(int){} }; class B : public A { public: void f(float) {} void g(int){} };
-
- 多态
- 多态是面向对象模型的重要思想,是指
- 多态既可以作用于成员函数多态也可以作用于成员变量,b
- 多态可分为“动态多态”:就是常见多态,还有“静态多态”
- 动态多态的主要实现方式是覆盖,使用显式接口,虚函数
- 静态多态体现在重载和模板编程,对于相关的对象类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系。只需要各个具体类的实现中要求相同的接口声明,这里的接口称之为隐式接口。客户端把操作这些对象的函数定义为模板,当需要操作什么类型的对象时,直接对模板指定该类型实参即可(或通过实参演绎获得)。相对于面向对象编程中,以显式接口和运行期多态(虚函数)实现动态多态,在模板编程及泛型编程中,是以隐式接口和编译器多态来实现静态多态。
- 静态多态示例:
-
class A { public: void f(){} }; class B{ public: void f(){} }; template void fun(T t) { t.f(); } int main(int argc, char** argv) { A a; B b; fun(a); fun(b); system("pause"); return 0; };
-
- 重载