在下面的示例中,
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)
};