这是一个理论问题,目的只是为了更好地理解为什么不支持以下情况。
查看以下代码:
class A
{
public:
A(){}
void f(int x){ printf("A::f(x)\r\n"); }
void g(int x){ printf("A::g(x)\r\n"); }
};
class B : public A
{
public:
B(){}
void f(){ f(5); } // <- does not compile
void f(){ A::f(5); } // <- compiles
void f(){ g(5); } // <- compiles
};
B类继承A类。
当B :: f()通过不使用其全名(即void f(){f(5);})调用A :: f()时,B :: f()无法编译,因为它找不到函数A :: f(int)。问题是为什么?
使用全名(显然有帮助... void f(){A :: f(5);})。但是真正使它变得怪异的是void f(){g(5); }有效!
我确实理解这是因为f()在A和B中都实现了,但是为什么编译器不能自己理解该方法在类A上呢?
谢谢!
ps我的猜测是,也许f()不仅在A中实现,而且可能在A的基类中实现,所以在这种情况下,编译器无法真正知道,但是正如我所写的,我只是在猜测...
编译器将首先通过名称查找函数,而忽略参数。因此它看到B::f()
然后开始尝试匹配参数。由于不B::f()
带任何参数,编译器将引发错误。调用时,g()
没有匹配项,B
因此编译器会查找A
并找到它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句