在下面的示例中,

void f(double, double);  // at global scope

struct Grandparent {
    void f(int);
    void f(double, double);
};

struct Parent : public Grandparent {
    void f(int);  // hides all overloads of Grandparent::f
};

struct Child : public Parent {
    void g() { f(2.14, 3.17); }  // resolves to Parent::f
};

Parent::f的声明如何主导和隐藏所有较祖先的声明而与签名无关,也就是说,即使两个成员函数具有非常不同的签名,Parent::f(int)仍然主导和隐藏Grandparent::f(double, double)的声明?

我通过https://en.wikipedia.org/wiki/Dominance_(C%2B%2B)遇到了这个例子

最佳答案

因为隐藏的是名称;不涉及签名。根据name lookup的规则,



对于这种情况,当在f的范围内找到名称Parent时,名称查找将停止;完全不会考虑Grandparent中的名称。 (顺便说一句:名称查找后,将在重载解析签名中进行检查以选择最匹配的一个)

如果这不是您期望的行为,则可以通过using引入名称。

struct Parent : public Grandparent {
    using Grandparent::f;
    void f(int);
};

struct Child : public Parent {
    void g() { f(2.14, 3.17); }  // refer to Grandparent::f(double, double)
};

08-24 18:02