重载
函数重载是指两个函数在同一个作用域并且函数名相同、参数(参数个数或类型或类型顺序
)不同的一种特殊情况
// 1、参数类型不同
int Add(int left, int right){
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right){
cout << "double Add(double left, double right)" << endl;
return left + right;
}
// 2、参数个数不同
void func(){
cout << "func()" << endl;
}
void func(int a){
cout << "func(int a)" << endl;
}
// 3、参数类型顺序不同
void func(int a, char b){
cout << "func(int a,char b)" << endl;
}
void func(char b, int a){
cout << "func(char b, int a)" << endl;
}
隐藏
隐藏又叫做重定义,是指两个成员函数分别在基类和派生类的作用域,并且函数名相同就构成了隐藏。
class A{ // 基类
public:
void fun()
{
cout << "func()" << endl;
}
};
class B : public A{ // 派生类
public:
void fun(int i) // 与基类的成员函数名相同,构成隐藏
{
cout << "func(int i)" <<i<<endl;
}
}
重写
重写又称为覆盖,是指两个虚函数分别在基类和派生类的作用域,并且函数名、参数、返回值都相同(协变例外)的两个虚函数,构成重写。
class Person { // 基类
public:
virtual void BuyTicket()
{
cout << "买票-全价" << endl;
}
};
class Student : public Person { // 派生类
public:
// 与基类的函数名、返回值、参数列表都相同,构成重写
virtual void BuyTicket()
{
cout << "买票-半价" << endl;
}
}
注意:析构函数的重写允许函数名不同。 如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同,看起来违背了重写的规则,其实不然,编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。
总结
从定义上看隐藏包含着重写,即重写是一种特殊的隐藏,只要两个基类和派生类的同名函数不构成重写,那么它就是隐藏;而重载与 隐藏和重写 最大的区别就是两个函数是不是在同一个作用域