在没有钻石继承的情况下,C++ 中的函数重载如何工作?

How Function Overloading in c++ works without Diamond Inheritance?

在下面的例子中,

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,

的规则

name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.

对于这种情况,当在 Parent 的范围内找到名称 f 时,名称查找将停止; Grandparent 中的名字根本不会被考虑。 (顺便说一句:名称查找后,在重载解析签名中将检查 select 最佳匹配)

如果不是您预期的行为,您可以通过 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)
};