之前在学习C++继承和多态的时候对于三个概念理解的不是很透彻,现在对这三个的概念来总结一下
重载 overload
重载:简单说就是函数名称相同,但是参数列表不相同的情形,这样的同名不同参数的函数互相称之为重载函数。
重载实际上属于多态的一种,是编译时多态即静态多态
来看看重载的条件
- 相同的范围(成员函数重载)
- 函数名相同
- 参数列表不同
在这里解释一下参数列表不同可以是以下几种不同
- 参数个数不同
- 参数类型不同
- 参数顺序不同
来看示例(都在类中实现)
我们可以看到,前四个互为重载函数,而最后一个不是。 不能只用返回值类型不同来重载函数
重写 override
重写也就是我们说的覆盖,覆盖是指派生类中的函数覆盖基类的函数
派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),那么派生类中的那个函数就相当于重写了基类的该函数。注:基类中被重写的函数必须有virtual关键字修饰
来看例子:
class Base
{
public:
virtual void fun(int i)
{
cout << "Base::fun" << i << endl;
}
};
class Derive :public Base
{
public:
virtual void fun(int i)
{
cout << "Derive::fun" << i << endl;
}
};
int main()
{
Base b;
Derive d;
Base* pb = &b;
pb->fun(3);
pb = &d;
pb->fun(5);
system("pause");
return 0;
}
派生类调用时会调用派生类的重写函数,不会调用被重写函数。
上面是利用虚函数实现多态的代码,不理解的可以戳链接(https://blog.csdn.net/qq_34021920/article/details/78307591)
隐藏
隐藏是指派生类的函数屏蔽了与其同名的基类函数。注:只要是同名函数,不管参数列表是否相同,基类函数都会被隐藏,有下面两种情况:
- 派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏
- 派生类函数名,参数列表,返回值类型与基类的完全一样,此时基类中被隐藏的函数不能有virtual修饰
class Base
{
public:
void fun(int i)
{
cout << "Base::fun" << i << endl;
}
};
class Derive :public Base
{
public:
void fun(int i, int j)
{
cout << "Derive::fun" << i << j <<endl;
}
};
int main()
{
Derive d;
d.fun(3);//出错
d.fun(5, 4);
system("pause");
return 0;
}
我们可以看出d.fun(3);本来是想调用基类的函数,但是基类的函数已经被隐藏,导致编程出错
重载和重写的区别
- 范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中
- 参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同
- virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有
隐藏与重写还有重载的区别
- 隐藏与重载的范围不同:重载和被重载的函数在同一个类中二隐藏与被隐藏函数在不同类中
- 参数列表不同:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,当参数相同时,若基类中的函数被virtual修饰,那就是被重写了。