覆盖是指派生类中如果存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致。覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本。
覆盖的特征为在不同的范围中(分别位于派生类与基类)的函数,函数名字相同,函数参数相同,基类函数必须有virtual关键字,覆盖的示例代码如下:
#include<iostream>
using namespace std;
//定义基类
class Boy
{
public:
virtual void g(void)
{
cout << "Boy::handsome!" << endl;//函数体
}
};
//定义派生类
class Girl:public Boy
{
public:
virtual void g(void)
{
cout << "Girl::beautiful!" << endl;//和上面的基类对比,只有函数体不同
}
};
int main()
{
Girl d;
Boy *pb = &d;
pb->g();
system("pause");
return 0;
}
运行结果:
Girl::beautiful!
请按任意键继续. . .
上面的代码中,虚函数Boy::g(void)被Girl::g(void)覆盖,从而在子类中产生了一个新的函数。
问题:什么时候发生函数覆盖?
覆盖在继承时派生类对于抽象类或者接口声明的方法的具体实现时使用。