1、重载:是指在同一访问区内(同一个类)被声明的具有不同参数列表的同名函数,在函数调用时可以通过参数列表来确定调用的对象,重载不关心函数的返回值类型。即同一类中,同名不同参。
参数列表不同主要表现在以下几个方面:
- (1)参数的个数不同
- (2)参数顺序不同
- (3)参数类型不同
这里需要注意函数返回值类型的不同,并不是重载。但函数声明为const是可以被认定为重载的。const对象只能调用cosnt方法,非const对象优先调用非const方法。
为什么在c语言中不支持函数重载?
在函数编译时,会给每个函数设置一库函数名。而在c语言中,这个库函数名的生成仅仅只和函数名有关。假设一个函数的声明为
int fun(int n,char m);
在c中的库函数名称为_fun,即仅仅之和函数名存在关系。
而在c++中的库函数名称为_fun_int_char,即和函数名和参数列表有关(注意:和函数返回值无关)。
所以:在C语言中如何定义同名函数,编译器是没有办法区分的,所以C语言中无法重载。
2、重写(覆盖):在派生类中重载对基类中的函数重新进行了实现,其函数名、返回值、参数列表都必须和基类中被重写的函数一致,这样就可以实现通过基类指针或引用来访问派生类中重写了的函数了。
3、隐藏:又被称为同名隐藏,指在派生类中实现了和基类的同名的方法,这样派生类的对象就会访问到派生类中实现的方法,而不是基类中的方法。
#include <iostream>
using namespace std;
class Test
{
public:
int fun(int n)
{
cout << "parent int n=" << n << endl;
return 0;
}
char fun(char n) //重载 同一个类的同名不同参的函数
{
cout << "parent char n=" << n << endl;
return 0;
}
virtual int fun1(int m)
{
cout << "parent int m=" << m << endl;
return 0;
}
};
class TestChild :public Test
{
public:
double fun(double n)//同名隐藏 派生类隐藏了基类的方法
{
cout << "child double n=" << n << endl;
return 0;
}
int fun1(int m) //重写(覆盖)派生类覆盖了基类的方法
{
cout << "child int m=" << m << endl;
return 0;
}
};
int main()
{
Test test;
TestChild testChild;
test.fun(2);
test.fun('c');
testChild.fun(1.1);
Test *pTest = new Test();
pTest->fun1(15);
pTest = new TestChild();//通过父类指针使用基类的函数,可以写virtual,也可以不写
pTest->fun1(20);
return 0;
}
重载、重写(覆盖)和隐藏的区别?
- (1)重载在同一个类中,重写和隐藏是在基类和派生类中。
- (2)重写(覆盖)派生类和基类的函数名,返回值、参数列表必须全部一致,而隐藏只需要和基类函数同名即可。
- (3)重写(覆盖)基类必须为虚函数。