我们定义了一个类,里面有很多方法,我们调用的其中某个方法,如何确定调用了哪些方法呢?
首先,我们知道函数查找的顺序如下:
1)查找函数的名字
2)从中找出最佳匹配。
3)检查是否具有该函数的访问权限
4)实参相依原则:根据实参的类型,自动进入相应的命名空间、类内部进行查找。
增加一条: 派生类成员按名字隐藏掉基类成员 class Base { public: virtual void f(int x); }; class Derived: public Base { public: virtual void f(double *pd); }; Derived *pd = new Derived; pd->f(10); // 错误! 问题在于Derived::f隐藏了Base::f,即使它们取的是不同的参数类型;所以编译器要求对f的调用取一个double*,而10这个数字当然不行。 这不很合理,但ARM对这种行为提供了解释。假设调用f时,你真的是想调用Derived中的版本,但不小心用错了参数类型。进一步假设Derived是在继承层次结构的下层,你不知道Derived间接继承了某个基类BaseClass,而且BaseClass中声明了一个带int参数的虚函数f。这种情况下,你就会无意中调用了BaseClass::f,一个你甚至不知道它存在的函数!在使用大型类层次结构的情况下,这种错误会时常发生;所以,为了防患于未然,Stroustrup决定让派生类成员按名字隐藏掉基类成员。