class animal
{
public:
virtual void breathe()
{
cout<<"animal breathe"<<endl;
}
};
class fish:public animal
{
public:
void breathe()
{
cout<<"fish bubble"<<endl;
}
};
派生类中的breach()函数和基类的breach()函数的函数名和参数列表都完全一样,子类的函数重写了基类中的函数,这成为函数的覆盖。发生函数覆盖的条件为:
一.基类函数为虚函数。(用virtual关键字声明的的函数)
二.必须发生在基类和派生类中。
三.函数名和参数列表必须完全一样。
如果基类的函数不是虚函数,即没有用关键字virtual声明,如下程序:
class animal
{
public:
void breathe()
{
cout<<"animal breathe"<<endl;
}
};
class fish:public animal
{
public:
void breathe()
{
cout<<"fish bubble"<<endl;
}
};
这种情况成为函数的隐藏。在派生类中隐藏了基类的同名函数。如果派生类的函数与基类的函数名字一样,参数不一样,不管基类函数有没有virtual关键字,基类函数都将被隐藏。这种情况与函数重载相似,重载发生在同一个类中。
如果函数名和参数完全一样,只有在基类函数没有virtual关键字函数的情况下才会发生隐藏。
总结:函数的覆盖是发生在派生类与基类之间,两个函数必须完全相同,并且都是虚函数。如果不属于这种情况就是函数的隐藏。
一个覆盖和隐藏的例子:
#include <iostream.h>
class Base
{
public:
virtual void xfn(int i)
{
cout<<"Base::xfn(int i)"<<endl;
}
void yfn(float f)
{
cout<<"Base::yfn(float f)"<<endl;
}
void zfn()
{
cout<<"Base::zfn()"<<endl;
}
};
class Derived : public Base
{
public:
void xfn(int i) //覆盖了基类的xfn函数
{
cout<<"Drived::xfn(int i)"<<endl;
}
void yfn(int c) //隐藏了基类的yfn函数
{
cout<<"Drived::yfn(int c)"<<endl;
}
void zfn() //隐藏了基类的zfn函数
{
cout<<"Drived::zfn()"<<endl;
}
};
void main()
{
Derived d;
Base *pB=&d;
Derived *pD=&d;
pB->xfn(5);
pD->xfn(5);
pB->yfn(3.14f);
pD->yfn(3.14f);
pB->zfn();
pD->zfn();
}