一,重载(overload)的定义
在同一可访问区内被声名的几个具有不同参数列表的(参数的类型、个数、顺序不同)同名函数,编译器会根据不同的参数列表来确定具体调用哪个函数,这种机制叫重载。重载不关心函数的返回值类型。但是,只有返回值相同的同名函数,才有可能构成重载关系。
二,函数重载(overload)注意的问题
1,在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序。
2,不能通过访问权限、返回类型进行重载。
三,覆盖(override)的定义
覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,覆盖是一个类的多态性的体现。
四,覆盖(override)注意的问题
1,覆盖的方法的特征标必须要和被覆盖的方法的特征标完全匹配,才能达到覆盖的效果。
2,覆盖的方法的返回值必须和被覆盖的方法的返回一致。
3,被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
4,基类的函数名前必须有virtual关键字,如果没有virtual关键字,那就是隐藏。
五,隐藏的定义
隐藏是指派生类的函数屏蔽了与其同名的基类函数。
六,隐藏应注意的问题
1,如果派生类的函数与基类的函数同名但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
#include<iostream>
using namespace std;
class Base{
public:
virtual void f1(int x, double y){
cout<<"virtual void f1(int x, double y)"<<endl;
}
void f1(){
cout<<"void f1()"<<endl;
}
};
class Derived : public Base{
public:
void f1(int x){
cout<<"void f1(int x)"<<endl;
}
};
int main(){
int x = 10;
Derived obj;
obj.f1();
return 0;
}
上面的代码在编译时会出错,因为派生类的名为f1的函数,会屏蔽从基类继承过来的名为void f1()的非虚函数,也会屏蔽从基类继承过来的名为virtual void f1(int x, int y)的虚函数,屏蔽了的这些函数对派生类对象来说都是不可见的,因此派生类的对象直接调用f1()会出错。2,如果派生类的函数与基类的函数同名,并且参数也相同但是基类函数没有virtual关键字。此时,基类的函数被隐藏。
七,实例代码
1,代码实例
#include<iostream>
using namespace std;
class Base{
public:
void f1(){
cout<<"void f1()"<<endl;
}
void f1(int x){
cout<<"void f1(int x)"<<endl;
}
};
class Derived : public Base{
public:
void f1(int x, double y){
cout<<"void f1(int x, double y)"<<endl;
}
};
int main(){
int x = 10;
Derived obj;
obj.f1(x);
return 0;
}
2,代码分析
上面的函数在编译时会出错,因为在Derived类中声明的f1函数,屏蔽了从基类继承过来的同名函数,也就是说基类的void f1()与void f1(int x)函数对Drived对象来说是不可见的,因此当Derived对象调用void f1(int x)函数时会报错。