一、函数重载
1、什么是函数重载
函数重载是在同一作用域内(不可以跨越类),函数名相同、参数的个数、类型、先后顺序至少有一个不同的函
数被称为重载的函数。在类中const成员函数与非const成员函数也可以构成重载的关系。
1、重载函数的作用:
在C++中进行函数的重载,可以解决具有功能相似但是函数参数不同导致的函数命名困难的情况。在C++中通常
用来对类的构造函数进行重载。
2、返回值类型与函数重载的关系:
注意:函数的返回值与函数重载没有任何关系,对,没有任何关系。函数重载要求的是函数名相同、参数的个数、
类型、先后顺序、是否为常成员函数,这样才可以构成重载的关系。
在调用重载的函数时,我们必须由传入的实参唯一的确定选择调用哪个函数,而不是在运行过程中,更不可能
在函数运行结束后由返回值来进行确定。
2、C语言不支持函数重载的原因
因为C++在编译的过程中可以根据函数的参数来对函数名进行重命名,这在保证了重载函数在重命名之后保证了
函数名的唯一性。而在C语言的编译过程中不会对函数进行重命名,而是保持了原始的函数名。
3、真假函数重载的识别方法
注意:是否是真正的函数重载只需要在进行函数调用时判断能否由传入的参数唯一的确定调用哪个重载函数,
而不是在函数运行过程中,更不可能是函数运行结束后由返回值确定。
例:
1、int calculation(int a, int b); 和 double calculation(int a, int b);
2、int calculation(int a, int b); 和 int calculation(const int a, const int b);
3、int calculation(int *a, int *b); 和 int calculation(int *const a, int *const b);
4、int calculation(int *a, int *b); 和 int calculation(const int *a, const int *b);
5、extern "C" int calculation(int a, int b); 和 extern "C" int calculation(doublle a, double b);
分析:
1、否。返回值不能确定函数的重载
2、否。const表示不能改变形参的值,这只能在运行过程中确定。
3、否。和第2中情况一样。
4、是。注意,虽然第4种情况和第2,3种情况相似,但却不一样。此处,第二个函数的const修饰的是*p,即p指向
的类型是const int类型,这与int是两种不同的类型。
例:const int a = 3, b = 4;
calculation(a, b);=====》调用int calculation(const int *a, const int *b);//C++中严格的类型检查
5、否。extern "C"是在C++的程序中调用C语言的语法编写的函数,告诉编译器以C语言的语法去编译所调用的函数,
而在C语言语法中是没有函数重载的概念的。
**二、函数重写(覆盖)
1、什么是函数的重写
在类的继承层次中,子类的新增方法与父类的虚方法函数名、参数、返回值完全相同时,称子类对父类的虚函数
进行了重写。即同名、同参、同返回值、通常是函数重写的基本条件。
2、函数重写的作用:
在C++中基类的虚函数和子类对父类的虚函数进行重写是多态实现的前提条件。
三、隐藏
1、什么是隐藏
在类继承层次中,当子类的新增成员变量或者成员函数与父类的成员变量或者成员函数同名时,子类的对象只
能“隐式”的调用子类的成员变量或者成员函数。
四、函数的重载、重写、隐藏的区别
1、重载的要点:
1)同一作用域内
2)函数名相同,函数的参数不同构成函数的重载(函数名相同、参数个数、顺序、类型、是否为常函数)
2、重写的要点:
1)父类与子类之间
2)父类的方法为虚方法
3)函数名、函数的参数、函数的返回值、是否为常函数必须完全相同(同名、同参、同返回值、同常)
3、隐藏的要点:
1)父类与子类之间
2)同名隐藏