c++ - c++ 中的函数重载如何在没有 Diamond 继承的情况下工作?
问题描述
在下面的示例中,
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)
解决方案
因为隐藏的是名字;不涉及签名。根据名称查找规则,
名称查找如下所述检查范围,直到找到至少一个任何类型的声明,此时查找停止并且不再检查范围。
对于这种情况,当名称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)
};
推荐阅读
- javascript - React 中的强制组件渲染
- android - 为什么连续添加多个空格时,使用字符串创建的位图的空格宽度会变短?
- android - 如何使 Ionic Toast 与屏幕阅读器更兼容
- python - InvalidArgumentError:不兼容的形状:[32] 与 [8] - Keras 迁移学习
- c# - 在 C# 中执行异步操作的正确方法
- spring - 将 SSL 添加到 sprint 引导
- c - C自动定义数组大小
- bash - 在测试函数中使用参数调用bash函数
- c# - Xamarin Forms 使用时不显示新页面
元素和SDK - python - 解析 txt 文件并根据列表提取特定部分