调用重写的虚函数而不是重载

2024-04-18

假设我有这部分代码:

#include<iostream>
using namespace std;
class A {
public:
    virtual int f(const A& other) const { return 1; }
};
class B : public A {
public:
    int f(const A& other) const { return 2; }
    virtual int f(const B& other) const { return 3; }
};

void go(const A& a, const A& a1, const B& b) {
    cout << a1.f(a) << endl; //Prints 2
    cout << a1.f(a1) << endl; //Prints 2
    cout << a1.f(b) << endl; //Prints 2
}
int main() {
    go(A(), B(), B());
    system("pause");
    return 0;
}

我可以理解为什么前两个会打印 2。但我无法理解为什么最后一个打印也是 2。为什么它不喜欢中的重载函数B?

我已经看过了this https://stackoverflow.com/questions/7530616/override-on-non-virtual-functions and this https://stackoverflow.com/questions/585913/c-member-function-virtual-override-and-overload-at-the-same-time但我无法理解这些。


int B::f(const B& other) constoverride http://en.cppreference.com/w/cpp/language/virtual#In_detail int A::f(const A& other) const因为参数类型不一样。那么就不会通过调用来调用f()基于基类的引用A.

如果某个成员函数 vf 在 a 中被声明为 virtual 类 Base 和一些派生类,直接派生或派生 间接地,从 Base 具有成员函数的声明 相同的

name
parameter type list (but not the return type)
cv-qualifiers
ref-qualifiers 

那么Derived类中的这个函数也是virtual的(无论是还是 其声明中未使用关键字 virtual)并且覆盖Base::vf(无论其中是否使用了 override 一词 宣言)。

如果你使用覆盖说明符 http://en.cppreference.com/w/cpp/language/override(C++11 起)编译器将生成错误。

class B : public A {
public:
    int f(const A& other) const { return 2; }
    virtual int f(const B& other) const override { return 3; }
};

Such as Clang http://rextester.com/BOIMX66399:

source_file.cpp:10:17: error: 'f' marked 'override' but does not override any member functions
    virtual int f(const B& other) const override { return 3; }
                ^

如果您在基类中为其添加重载,您可能会得到您想要的。请注意,类的前向声明B将需要。

class B;
class A {
public:
    virtual int f(const A& other) const { return 1; }
    virtual int f(const B& other) const { return 1; }
};

LIVE http://rextester.com/KRAWT94911

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

调用重写的虚函数而不是重载 的相关文章

  • 自定义可视化 Web 部件属性 sharepoint

    我在 Visual Studio 2012 中创建可视 Web 部件属性时遇到问题 我被提及http msdn microsoft com en us library ee231551 aspx http msdn microsoft co
  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • 将 try_emplace 与 shared_ptr 一起使用

    所以我有一个std unordered map
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • 我应该使用函数还是无状态函子?

    这两段代码做同样的事情 如您所见 它将用于排序函数 哪个更好 我通常写后一种 但我看到一些程序员像以前那样做 struct val lessthan binary function
  • 未定义条件编译符号

    我无法让 Visual Studio 按照我的预期运行 我创建了 2 个配置文件 一个定义了符号 FOO 另一个定义了符号 BAR 我有这个代码 static class MyClass if FOO public static strin
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 读取所有进程内存以查找字符串变量c#的地址

    我有 2 个用 C 编写的程序 第一个名为 ScanMe 的程序包含一个包含值 FINDMEEEEEEE 的字符串变量 以及一个值为 1546 22915487 的双精度变量 另一个名为 MemoryScan 的程序读取第一个程序的所有内存
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Xamarin.Mac 中执行终端命令并读入其输出

    我们正在编写一个 Xamarin Mac 应用程序 我们需要执行像 uptime 这样的命令 并将其输出读取到应用程序中进行解析 这可以做到吗 在 Swift 和 Objective C 中都有 NTask 但我似乎无法在 C 中找到任何示
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • jquery ajax“发布”调用

    我是 jQuery 和 Ajax 的新手 并且在 发布 方面遇到问题 我正在使用 jQuery Ajax post 调用将数据保存到数据库 当我尝试保存数据时 它将 null 传递给我的 C 方法 jQuery 看起来像这样 functio
  • 组合框由于某种原因被链接

    我有以下代码来填充 3 个组合框 private void PopulateDDLs SqlConnection connection SqlCommand command SqlDataReader reader DataTable dt

随机推荐

  • CXF ClientProxy getClient“不是代理实例”

    我正在尝试将 WS security 与我的 Apache CXF 客户端结合使用 我需要掌握客户端端点 以便添加 WSS4J 拦截器 然而 当我打电话时ClientProxy getClient 我得到一个IllegalArgumentE
  • 无法使用 Visual Studio 2013 社区运行 Xunit

    我正在尝试让 XUnit 与 Visual Studio 2013 Community 版本 12 0 31101 00 Update 4 一起使用 我已经让 NUnit 工作了 所以我认为让 XUnit 工作起来会很简单 代码是 usin
  • java.net.ConnectException:无法连接到/127.0.0.1:9080领域对象服务器

    我在看到网站中的文档后刚刚安装了领域对象服务器 我创建了一个登录页面 android 并根据网站使用了同步用户设置 但我在创建时的 asynctask 显示了上述错误 这是我的代码 public class RealAsyncTask ex
  • 动态创建类属性

    我正在寻找一种方法来动态创建具有可通过典型实例表示法访问的特定属性的类 DynoOne createClass DynoOne props A B d DynoOne database XYZ d A d B 1 DynoTwo creat
  • 有没有办法获得总设备内存?我需要它来优化

    我有一个可以包含静态数据的 lrucache 这样即使我的应用程序在用户返回时关闭 他也可以更快地找到数据 然而 这需要大约 10 15 MB 的内存 所以我想创建一个像这样的 if 分支 if deviceOverallRAM gt tr
  • 从一个活动调用另一个活动中的方法

    我知道我们无法从另一个活动中的活动调用方法 我正在尝试找出解决这个问题的最佳方法 这是我的代码 这是我试图调用的方法 它在我的ScoreCard活动 public void numPlayerSetup int ids R id TextV
  • 更改文件创建日期不起作用

    我使用以下命令来更改文本文件的创建日期 using System IO DateTime newCreate new DateTime year month day hour minutes seconds File SetCreation
  • 在 JavaScript 中确定域名?

    使用有什么区别 if document domain toLowerCase indexOf domainName 1 and if window location href match 1 toLowerCase indexOf doma
  • 是否可以使用 content:// 作为 WebView 中

    我创建了一个ContentProvider 它导出我的 asset 目录中的文件 我使用 content url 来访问 WebView 中导出的内容 以下 HTML 按预期工作 img src 我正在尝试使用 mp3 音频文件的内容提供程
  • php 将变量绑定到旧 PHP 中的函数作用域

    我想将变量绑定到函数的作用域 我可以在 PHP 5 3 之后使用 use 关键字在 php 中执行此操作 但是如何在 PHP 5 3 以下的版本中执行等效操作 test use keyword function test use keywo
  • RDBMS 对 Golang 的影响 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我不会对这个关于我测试过的内容和数字运算的问题进行长篇大论 我对最新的实际练习表演更感兴趣 我已经阅读了大量的文章 其中一些非常怀疑 或者非常怀
  • Visual Studio 默认自动完成使用系统类型名称

    奇怪的问题 但我的老板有点老派 坚持在我们的编码标准中我们不使用 C 简写系统类型 他喜欢我们使用完整的系统名称 他喜欢事情变得冗长 我很乐意遵守这个标准 然而 几个月后开始让我恼火的是 Visual Studio 在完成代码时不喜欢遵守标
  • Android 如何从相机捕获两个连续的帧

    我正在尝试在 Android 设备上对光流进行编程 我的问题是从相机获取两个连续的帧 这是获取一帧的代码 mCamera setPreviewCallback new PreviewCallback public void onPrevie
  • Java 装饰器模式:我可以装饰受保护的方法吗?

    我想要Decorate 装饰器设计模式 一个通用的基类 但是我需要的方法Decorate受到保护 参见示例 public class AbstractActor public void act Delegates its actions t
  • 强制隐式调用的依赖类型解析

    我有一个包装特征 trait Wrapper T type Own F lt OwnThing F def ask F implicit own Own F 还有不同的实现 这里是一个例子 class CombinedWrapper A B
  • 暗淡和公共有什么区别?

    今天提出了一个关于范围的问题 这引起了我的思考 我一直了解 VBScript 范围以及如何声明全局和本地 我突然想到我从来没有使用过Public变量但倾向于使用Dim相反 在全局声明时 据我了解Dim是相同的Public 但如果是这样的话
  • PHP 密码的正则表达式 [重复]

    这个问题在这里已经有答案了 我在网上找到了一个脚本 它有一个 JavaScript 中的密码正则表达式 我仍然想使用它 但为了更安全 我也想使用 PHP 来验证我的密码 但我对正则表达式毫无用处 要求 必须至少 8 个字符 必须包含至少 1
  • 使用 sass 3 自定义 Bootstrap 5 颜色时出现无效 CSS 值错误

    我想用 SASS 更改 bootstrap 默认主题颜色 问题是当我更改颜色并编译时 它会给我无效的 CSS 值错误 我已阅读文档并在 YouTube 上看到了一些教程 但我看不出问题出在哪里 我正在使用 bootstrap 5 1 0 s
  • 此应用程序是否使用广告标识符 (IDFA)? - AdMob 6.8.0

    我目前正在将我的应用程序上传到 App Store Apple 询问我此应用程序是否使用 IDFA 我正在使用最新的 Admob SDK 或 6 8 0 但我不知道它是否使用 IDFA 如果使用 我应该点击哪些复选框 Image http
  • 调用重写的虚函数而不是重载

    假设我有这部分代码 include