重载
- 两个函数必须在同一作用域。
- 函数名必须相同。
- 函数的参数列表必须不同(参数的个数、次序、类型)。
- 与返回值类型无关。
int add(int a, int b){
cout << "int_int_int" << endl;
return a + b;
}
double add(double a, double b){
cout << "double_double_double" << endl;
return a + b;
}
int add(int a, double b){
cout << "int_int_double" << endl;
return a + b;
}
int main(){
add(1, 2);
add(1.0, 2.0);
add(1, 2.0);
return 0;
}
上面代码中的三个“add”函数就构成重载。
重定义(隐藏)
- 不在同一作用域,必须在继承体系中。
- 基类与派生类具有相同名称的成员(成员函数、成员变量)。
- 与参数列表、返回值类型无关。
class A{
public:
void print(){
cout << "A::print()" << endl;
}
int _a1;
int _a2;
};
class B:public A{
public:
void print(int x){
cout << "B::print()" << endl;
}
int _a2;
};
int main(){
B b;
b.print(2); //B::print()
b.A::print();//A:;print()
return 0;
}
上面继承体系代码中的成员函数print函数以及成员变量_a2 构成重定义(隐藏),派生类想要访问基类的成员可以通过作用域限定符。
重写(覆盖)
- 不在同一作用域,必须是在构成多态的继承体系中虚函数。
- 基类与派生类具有相同名称的成员(成员函数、成员变量)。
- 参数列表、返回值类型也必须相同。
class A{
public:
virtual void print(){
cout << "A::print()" << endl;
}
int _a1;
};
class B :public A{
public:
virtual void print(){
cout << "B::print()" << endl;
}
int _b;
};
void fun(A& a){
a.print();
}
int main(){
A a;
B b;
fun(a);
fun(b);
return 0;
}