C++成员函数隐藏的原因[重复]

2023-12-01

可能的重复:
名称隐藏和脆弱的基础问题

我熟悉涉及成员函数隐藏的规则。基本上,具有与基类函数同名的函数的派生类实际上不会重载基类函数 - 它完全隐藏了它。

struct Base
{
    void foo(int x) const
    {

    }
};

struct Derived : public Base
{
    void foo(const std::string& s) { }
};


int main()
{
    Derived d;
    d.foo("abc");
    d.foo(123); // Will not compile! Base::foo is hidden!
}

所以,你可以通过以下方式解决这个问题using宣言。但我的问题是,基类函数隐藏的原因是什么?这是标准委员会的一个“功能”还是一个“错误”?是否存在某些技术原因导致编译器在找不到匹配项时无法在基类中查找匹配重载d.foo(123)?


名称查找的工作原理是在当前范围中查找匹配的名称,如果没有找到任何内容,则在封闭范围中查找,如果没有找到,则在封闭范围中查找,依此类推,直到到达全局命名空间。

这不是特定于类的,您可以在这里得到完全相同的名称:

#include <iostream>

namespace outer
{
  void foo(char c) { std::cout << "outer\n"; }

  namespace inner
  {
    void foo(int i) { std::cout << "inner\n"; }

    void bar() { foo('c'); }
  }
}

int main()
{
  outer::inner::bar();
}

虽然outer::foo(char)更适合通话foo('c')找到后停止名称查找outer::inner::foo(int) (i.e. outer::foo(char)被隐藏),所以程序打印inner.

如果不隐藏成员函数名称,则意味着类作用域中的名称查找行为与非类作用域不同,这会不一致且令人困惑,并使 C++ 更难学习。

因此,没有技术原因无法更改名称查找规则,但必须针对成员函数和其他类型的名称查找更改它们,这会使编译器变慢,因为即使在之后,它们也必须继续搜索名称在当前范围内查找匹配的名称。显然,如果当前范围内有一个名称,那么它就是probably你想要的那个。范围内的调用A可能想在该范围内查找名称,例如如果两个函数位于同一名称空间中,它们可能是相关的(同一模块或库的一部分),因此如果一个函数使用另一个函数的名称,则可能意味着在同一范围内调用另一个函数。如果这不是您想要的,则使用显式限定或 using 声明来告诉编译器其他名称应该在该范围内可见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++成员函数隐藏的原因[重复] 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • Java围绕参数值同步方法

    考虑以下方法 public void upsert int customerId int somethingElse some code which is prone to race conditions 我想保护此方法免受竞争条件的影响
  • 开玩笑测试不使用 dotenv 读取环境变量

    我正在对一个调用环境变量的函数运行测试 但未定义 我尝试过但不起作用的解决方案 1 add require dotenv config path env 在我的测试文件中 2 在 package json 中传递全局变量 jest glob
  • spring boot - @PostConstruct 未在 @Component 上调用

    我是 spring 新手 我使用以下命令创建了一个新的 spring boot 项目https start spring io 没有进一步的依赖项 解压缩 zip 文件并在 IntelliJ IDEA 中打开该项目 我没有进行任何进一步的配
  • 撤消 git pull --rebase?

    我刚刚跑了 git pull rebase 并且忘记指定 来源 它看起来像是从所有不同的分支中提取的 有没有办法从这里恢复我的存储库以撤消拉动 Thanks After a git pull手术 ORIG HEAD应该指向之前的值HEAD
  • 从 JSONArray 获取 JSONObject [重复]

    这个问题在这里已经有答案了 我对从服务器获得的 JSONObject 进行了一些修复 jsonObj new JSONObject resultString JSONObject sync reponse jsonObj getJSONOb
  • 在 iOS 设备上访问以编程方式创建的日历

    我已经弄清楚如何在 iPhone 应用程序中添加自定义日历 但我不知道如何将该日历添加到设备的日历中 从应用程序内查看时 该事件会显示正确的日历 但即使我点击事件的日历行 我的日历也不在列表中 如果我想保持日历名称正确 我必须取消 有没有办
  • 我们是否应该始终在 Swift 中的闭包内使用 [unowned self]

    WWDC 2014 第 403 场中级斯威夫特 and 成绩单 有下面的幻灯片 发言者说 在这种情况下 如果我们不使用 unowned self 在那里 将会出现内存泄漏 这是否意味着我们应该始终使用 unowned self 内部封闭 O
  • 确定变量是否在 Python 中定义[重复]

    这个问题在这里已经有答案了 如何知道运行时代码中的特定位置是否已设置变量 这并不总是显而易见的 因为 1 可以有条件地设置变量 并且 2 可以有条件地删除变量 我正在寻找类似的东西defined 在 Perl 或isset 在 PHP 中或
  • 自定义元素未拾取 onclick

    我正在定义一个自定义元素 customElements define my button class extends HTMLButtonElement onclick console log bar extends button http
  • Unix Sockets 的缓冲特性

    有谁知道 Unix 套接字在发送小块数据 几个字节 时的缓冲特性 当我使用 TCP 套接字时 我可以禁用 Nagle 算法以防止数据传输中的延迟 但 Unix 域套接字没有 据我所知 等效的功能 unix 域套接字上没有可用的 nagle
  • 如何实现固定步长循环?

    我试图在我的程序中创建一个固定的步骤循环 但由于某种原因我似乎无法让它正常工作 基本上我需要的是一个循环 while over Update elapsedtime Draw elapsedtime 或类似的东西 带有 我尝试过使用 Thr
  • 控制对未来内容的访问

    这主要是关于未来的公共内容 但不仅如此 在标准 Plone 站点中 如果您创建的顶级内容未显示在导航上 仍然是私有的 那么您将其公开 通过工作流程 并显示在导航上 但稍后您会在将来计时它再次从导航中消失 不过 此时 如果匿名 登录用户知道
  • 如何制作单个可执行文件 VS 2010

    我正在使用 C 和 DirectX 制作游戏 如果能够通过提供单个可执行文件而不是运行安装向导来与其他人分享我的小组进度 那就太好了 我已经检查了我的发布和调试文件夹 但这些可执行文件不起作用 发布的 exe 大小约为 21KB 这似乎不正
  • devtools/GitHub 下载错误

    截至今天我无法使用devtools从 GitHub 安装包 不知道错误是否在于 Me 开发工具 GitHub 我在用着install github如下并得到以下错误 library devtools install github repor
  • 如何使用 WebDav 将 dav:href 与 Outolook Interop href 值匹配

    我以前曾使用 webdav 根据主题和时间访问 Exchange 2003 服务器上发送的消息 这很有效 我现在需要实现另一个功能 这意味着将消息从客户端 Outlook 不是 Web 访问 拖到 Windows 窗体上 然后在 Excha
  • 使用广播接收器更改日期时无法运行服务

    我创建了一个生日提醒应用程序 我想在晚上 12 00 开始服务来扫描数据库中人员的生日 我添加了一个广播接收器
  • iPad/iPhone 悬停问题导致用户双击链接

    我有一些我以前建立的网站 使用 jquery 鼠标事件 我刚买了一个 ipad 我注意到所有鼠标悬停事件都被转换为单击 所以例如我必须执行两次单击而不是一次单击 第一次悬停 而不是实际点击 有解决方法可以解决这个问题吗 也许我应该使用 jq
  • 为什么 OS X 上的 FF 在单击事件处理程序中丢失了 jQuery-UI?

    在使用 jQUery 1 7 1 和 jQUery UI 1 8 18 的网页中 如果我在文档准备好时在警报框中输出 ui 我会得到 object Object 但是 当使用 Firefox 时 如果我在单击事件处理程序中输出 ui 则会得
  • 重用 UITableView 中的单元格

    我有我的自定义单元 NewsCell 它包含我的自定义视图 ImageMosaicView 它只是 UIView 的子类 我用它来显示照片 就像 Facebook 上发布的照片 一样 我只是将图像的 url 传递给 ImageMosaicV
  • C++成员函数隐藏的原因[重复]

    这个问题在这里已经有答案了 可能的重复 名称隐藏和脆弱的基础问题 我熟悉涉及成员函数隐藏的规则 基本上 具有与基类函数同名的函数的派生类实际上不会重载基类函数 它完全隐藏了它 struct Base void foo int x const