2.2.8 函数的覆盖和隐藏(2)
在这个例子中,Derived类的fn(int)函数隐藏了Base类的fn()函数,Derived类fn(int)函数不是虚函数(注意和覆盖相区别)。Derived2类的fn()函数隐藏了Derived类的fn(int)函数,由于Derived2类的fn()函数与Base类的fn()函数具有同样的函数名和参数列表,因此Derived2类的fn()函数是一个虚函数,覆盖了Base类的fn()函数。注意,在Derived2类中,Base类的fn()函数是不可见的,但这并不影响fn函数的覆盖。
当隐藏发生时,如果在派生类的同名函数中想要调用基类的被隐藏函数,可以使用"基类名::函数名(参数)"的语法形式。例如,要在Derived类的fn(int)方法中调用Base类的fn()方法,可以使用Base::fn()语句。
有的读者可能会想,我怎样才能更好地区分覆盖和隐藏呢?实际上只要记住一点:函数的覆盖是发生在派生类与基类之间,两个函数必须完全相同,并且都是虚函数。那么不属于这种情况的,就是隐藏了。
最后,我们再给出一个例子,留给读者思考,代码如例2-22所示(EX09.CPP)。
例2-22
- #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();
- }