C++ 为什么基类中具有相同名称(而不是签名)的方法必须使用继承类的全名进行调用?

C++ 为什么基类中具有相同名称(而不是签名)的方法必须使用继承类的全名进行调用?,c++,inheritance,C++,Inheritance,这是一个理论问题,只是为了更好地理解为什么不支持下面的场景 请查看以下代码: 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

这是一个理论问题,只是为了更好地理解为什么不支持下面的场景

请查看以下代码:

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
};
A类
{
公众:
A(){}
void f(int x){printf(“A::f(x)\r\n”);}
void g(int x){printf(“A::g(x)\r\n”);}
};
B类:公共A
{
公众:
B(){}

void f()
B
中没有匹配项,因此编译器在
A
中查找并找到它。

这就是非限定名称查找的工作方式:它从当前范围开始,向上和向外搜索,找到名称后立即停止。
f
的名称查找搜索类
B
,找到许多声明然后对找到的任何东西执行重载解析;在这种情况下,重载解析失败。
g
B
中找不到,因此查找继续搜索
A
。要使其工作,请在
B
的定义中使用A::f添加
,这将所有东西命名为
f
A
进入
B
的范围。因此它查找B,没有找到,为什么它不继续到A?仅仅是一个定义?还是真的有问题?它一找到匹配的名称就停止了。它找到了。事实上在类
B
中有名称
f
的声明。只有在以后编译器才能确定s表示它们都不适合调用。首先进行名称查找;然后进行重载解析(在查找找到的函数上);最后进行访问检查(在重载解析拾取的函数上)。您可以使用类B中的A::f执行:
,它会找到它。