重载
- 函数名字相同,但参数列表或者返回值不同
- 一组函数要重载必须处在同一作用域中
class Base
{
public:
Base(int data=0):m_a(data){}
void show(){cout<<"Base::show()"<<endl;}
void show(int){cout<<"Base:show(int)"<<endl;}
private:
int m_a;
};
如上,Base类中的show()成员函数和show(int)成员函数的名字相同,但是参数不同,并且他们都在同一作用域(Base类这个作用域)下,因此这组成员函数属于重载关系。
调用时,编译器可根据传入参数的数量和类型自行选择调用,测试如下
void test(){
Base b;
b.show();
b.show(1);
}
隐藏
- 隐藏是指作用域的隐藏
- 在继承结构中,派生类的成员函数与基类的成员函数同名
- 则派生类的成员函数会隐藏掉基类的成员函数调用
class Derive:public Base
{
public:
Derive(int data=0):Base(data),m_b(data){};
void show(){cout<<"Deive::show()"<<endl;}
private:
int m_b;
};
以上代码中,Derive类继承Base类,且Derive类中有一个和Base类同名的成员函数show。接下来我们来看测试代码的运行结果
void test(){
// Base b;
// b.show();
// b.show(1);
Derive d;
d.show();
}
从运行结果可以看到,子类对象在调用与基类同名的成员函数(show())函数时,运行结果显示调用的是子类的show(),而不是基类的show()
这是因为,子类的show成员函数与基类的show成员函数重名了,因此子类隐藏掉了基类的同名成员。
因此,从关系上看
- Base::show()与Base::show(int)属于重载关系
- Base::show()、Base::show(int)和Derive::show()属于隐藏关系
在这种情况下,想调用基类的同门函数,加上作用域即可
d.Base::show();
重写(覆盖)
基类和派生类的方法,返回值、函数名以及参数列表都相同,而且基类的方法是虚函数,那么派生类的方法就自动处理为虚函数,他们之间成为覆盖关系
详见
c++虚函数、静态绑定与动态绑定-CSDN博客https://blog.csdn.net/qq_58158950/article/details/136016053?spm=1001.2014.3001.5502
重写只能应用于虚函数