🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 重载      重载是指有两个或多个函数名相同,但是函数的参数列表(参数的类型、个数、顺序)不同。对于重载函数的调用,在编译期间就已经确定了,是静态的,它们的地址在编译期间就绑定了,注意,这与多态无关!!!程序会根据不同的参数列来确定具体调用哪个函数。 ``` double calculate(double); double calculate(double, int); double calculate(double, double); double calculate(double, float); double calculate(int, dounle); double calculate(int); ``` 6个同名函数calculate,它们中任意两个构成重载,因为它们的参数列表不同 重载函数具有如下特征: 1):相同的范围(如在同一个类中); 2):函数名称相同; 3):参数列表不同; 4):virtual关键字可有可无; ## 覆盖      覆盖是指派生类中存在重新定义的父类的函数,其函数名、参数列表、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数与被覆盖函数只有函数体不同。 ``` class A { public: void f1(){cout<<"A::f1()"<<endl;} } class B:public A { public: void f1(){cout<<"B::f1()"<<endl} } ``` 派生类B中的函数f1()就覆盖了父类中的函数f1(),当派上类对象调用函数f1()时会自动调用派生类的覆盖版本,而不是父类中被覆盖的版本。 覆盖的特征如下: 1):不同的范围(分别位于派生类和父类); 2):函数名称相同; 3):参数相同; ## 多态 ### 编译时多态 就是在编译期确定的一种多态。在C++中主要体现在函数模板,这里需要注意,函数重载和多态无关,很多地方把函数重载误认为是编译多态,这是错误的??? ``` //例1 函数模板体现编译期多态性 #include <iostream> using namespace std; template <typename T> T add(T a, T b) { t c = a+b; return c; } int main() { int a1 = 1; int b1 = 2; int c1 = add(a1,b1); cout<<"c1:"<<c1<<endl; double a2 = 2.0; double b2 = 4.0; double c2 = add(a2,b2); cout<<"c2:"<<c2<<endl; } ``` 在上述例子中,定义了一个函数模板,用来计算两个数的和。这两个数的数据类型在使用时才知道,main函数中调用同一个函数分别计算了两个int值和两个double值的和,这就体现了多态,在编译期,编译器根据一定的最佳匹配算法来确定函数模板的参数类型到底是什么,这就体现了**编译期的多态性**。 ### 运行时的多态性      C++运行时多态性主要是通过虚函数来实现的。体现在具有继承关系的父类和子类之间,子类重新定义父类的成员函数成为覆盖或者重写,而虚函数允许子类重新定义父类的成员函数,即重写父类的成员函数。