在C++的继承体系中,名称的查找按照一定的规则进行:首先在局部作用域中进行查找,如果找到则停止,如果没找到则到外层进行查找,一次类推。特别需要注意的是,C++在查找的时候,只会对名字进行比较查找,不会对名字的类型加以注意比较。
例如定义如下两个类Base和Derive:
class Base
{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
};
class Derive:public Base
{
public:
virtual void mf1();
void mf3();
void mf4();
};
在使用这两个类的时候,对于变量和函数的查找根据上面说的规则进行,如果在函数中有如下代码:
Derive d;
int x;
...
d.mf1();//call mf1() in Derive
d.mf1(x);//error in Derive,the function mf1(int) in the base class if hidden
d.mf2();//ok call Base::mf2()
d.mf3();//ok call Derive::mf3()
d.mf3(x)//error in Derive,no function mf3(int),mf3(int) in Base is hidden
在查找的过程中,只对名称和参数进行比较,对于类型(如virtual)不进行比较。如果想在派生类的成员函数中使用被隐藏的基类函数,可以使用using声明或者是使用转交函数,即在派生类函数中使用Base::mf1(int)这样形式的代码调用基类的成员函数。