重载机制是C++编译时多态的表现形式之一,具体表现为函数名称相同但是传入的参数不同,编译器根据具体的参数执行相应的函数。如果传入非常量或者指向非常量的指针,重载的函数都能调用,但是对于编译器优先选择非const版本传入常量或指向常量的指针时,只能选择const版本。特别的,当函数里面有同名函数时候函数外部的函数会被隐藏。我们在使用函数重载的时候要特别注意,必须要把需要重载的函数的声明写在一起在同一个作用域中,要么都在全局,要么都在局部,要是在不同作用域就不会发生重载。
1:重载与作用域
先看看正常的重载是怎么实现的
```
void print(const string& str);
void print(int val);
void print(double val);//三个重载函数的声明
void print(const string& str)
{
cout<<str<<endl;
}
void print(int val)
{
cout<<val<<endl;
}
void print(double val)
{
cout<<val<<endl;
}
int main(void)
{
print("qwer");
print(1);
print(2.3);
}
```
如果我们用一个在函数里面声明新的函数去屏蔽原有的函数,例如
```
int main(void)
{
void print(int a);
print("qwer");
print(1);
print(2.3);
}
```
在函数里面新声明的函数会屏蔽掉传入string 参数的函数,会提示无法将string 类型转换为int 类型的错误。必须指出,在函数里面声明新的函数是非常不明智的做法,必须丢到这种习惯。
2:继承中的重载
```
class A
{
public:
A(){}
virtual ~A(){}
void print(string& str)
{
cout<<str<<endl;
}
};
class B:A
{
public:
B(){}
~B(){}
void print(int a)
{
cout<<a<<endl;
}
void test()
{
string a="123";
print(a);
}
};
```
可以看到,在基类和派生类中定义两个参数不同的函数时候,基类中的重载函数将会被屏蔽。如果加上虚函数,那就是常见的运行时多态了。所以结论是,重载必须发生在同一个作用域中否则就会覆盖或者屏蔽。