C++调用基类方法切片对象

2024-01-06

我有这样的事情:

#include <iostream>

class X;

class A {
public:
  virtual void bar(X &x);
};

class B : public A {
public:
};

class X {
public:
  void foo(A &a) { std::cout << "foo A" << std::endl; }
  void foo(B &b) { std::cout << "foo B" << std::endl; }
};

void A::bar(X &x) { x.foo(*this); }

int main(int argc, char **argv) {
  X x;
  B b;
  b.bar(x);
  return 0;
}

编译并执行它,你将得到:

# ./a.out
foo A
#

我相信这是因为对象在转换为 A 时被切片。我怎样才能避免这种情况,所以我得到

foo B

没有实现 B 中的方法或使用一些奇怪的东西,比如奇怪的重复模板模式 http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern ?


这里没有进行切片,因为您小心地通过引用传递对象;切片需要按值操作对象。

其效果是由于过载解析,这是静态完成的(即在编译时)。当C++编译这个成员函数时

void A::bar(X &x) {
    x.foo(*this);
}

它需要在编译时决定选择两个重载中的哪一个。这个决定很简单:编译器知道*this属于类型A,所以它调用void foo(A &a)功能。

You cannot get it to work without implementing the same method in B*, using templates, or implementing your own dispatch scheme with function objects or lambdas.

* in which case you would end up with a nearly classic C++ implementation of the Visitor Pattern http://en.wikipedia.org/wiki/Visitor_pattern, a technique of implementing Double Dispatch http://en.wikipedia.org/wiki/Double_dispatch.

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

C++调用基类方法切片对象 的相关文章

  • 是否保证 sizeof(T[N]) == N * sizeof(T) ?

    我一直假设 N 个元素类型的数组的大小T 由返回sizeof保证正好是N次sizeof T The 对这个问题的评论 https stackoverflow com questions 46457449 is it always the c
  • 将 ARGB 拆分为字节值

    我有一个 ARGB 值存储为 int 类型 它是通过调用 ToArgb 来存储的 我现在想要来自 int 值的各个颜色通道的字节值 例如 int mycolor 16744448 byte r g b a GetBytesFromColor
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 我如何知道向量的实际最大大小? (不使用 std::vector::max_size)

    在在线课程中 我正在学习向量 在其中一个例子中 他们解释说 std vector max size 应该给我向量可以达到的最大大小 我决定测试一下 include
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • C++ 模板参数数量错误(2,应该是 1)

    我使用 C 并行快速排序程序进行了测试 如下所示 首先使用列表作为容器 然后我转移到通用容器类型 但它报告了标题错误 可以帮忙解决这个问题吗 include
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 如何使用 .NET 捕获我的桌面视频?

    我想知道是否有任何方法可以使用 NET 捕获我的桌面的视频 截屏视频 我并不是在寻找截屏软件 而只是在寻找一种可以让我自己生成桌面视频的技术 我想过拍摄多个屏幕截图 但我不确定如何以编程方式生成带有图像序列的视频 有人有主意吗 Thanks
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas
  • DbContext.SaveChangesAsync 异常处理

    当搭建新的脚手架时ApiController通过 Visual Studio 2013 中的异步操作和实体框架支持 某些方法可以包装DbContext SaveChangesAsync https msdn microsoft com en

随机推荐

  • 使用 ICommand 的按钮不会被禁用?

    我的 wpf mvvm 应用程序中有一个按钮控件 我用一个ICommand属性 在 viewmodel 中定义 将按钮单击事件绑定到 viewmodel 我有 gt 执行和canexecute我的参数ICommand执行 RelayComm
  • 如何使用 Java Mission Control 监控远程服务器中的 JVM?

    是否可以使用JMC 监控远程服务器中的 JVM 如果是这样我该怎么做 在使用之前是否需要调用任何特定的 java 标志 我尝试创建一个新的 JVM 连接 并指定向导中要求的所有详细信息 但是当我测试连接时它无法连接到该服务器 由于需要进行一
  • IIS 站点不断提示输入 Windows 身份验证方法的凭据

    我需要一些帮助来了解我无法在 IIS 站点上针对特定用户组使用 Windows 身份验证的确切原因 发生的情况是 即使我的用户属于我授予站点访问权限的组的一部分 IE 也会不断提示我输入凭据 甚至当我输入密码时 HTTP 响应也是 401
  • 如何使用库(插入符号)更改指标?

    我想使用以下方法将指标从 RMSE 更改为 RMSLE caret library 给定一些示例数据 ivar1 lt rnorm 500 mean 3 sd 1 ivar2 lt rnorm 500 mean 4 sd 1 ivar3 l
  • LINQ + Foreach 与 Foreach + If

    我需要迭代对象列表 仅对布尔属性设置为 true 的对象执行某些操作 我正在这段代码之间争论 foreach RouteParameter parameter in parameters Where p gt p Condition do
  • 使用 mod_wsgi 从不运行 Django 的站点提供 Django 应用程序 /

    我有一个网站 目前正在使用 Django 逐个应用程序重写 服务器是RedHat 运行 Apache 2 安装 mod wsgi 一切正常 惊人的 如果我去http www example com http www example com
  • preg_replace() 找不到结束分隔符?

    I use preg replace 很多 但我不是这方面的天才 如果我启动一个功能并故意键入我想要使用的所有表情符号 例如 但今天我尝试更改它并使用 mysql 让我可以随意插入和删除它们 而无需在我的代码中播放 但是当我尝试它时 它只会
  • Angular2:检测表单变化

    在 Angular2 4 0 中我有一个FormGroup看起来像这样 this form this fb group a Validators required b Validators required c Validators req
  • macOS 上的 NavigationLink 无法在同一视图中打开

    我目前正在构建一个 macOS 应用程序SwiftUI 无 Catalyst 应该有一个侧边栏和其右侧的单个视图 NavigationView List listStyle SidebarListStyle HomeView 我的主页视图有
  • Angular 4单个API请求运行多次

    我遇到有关 Angular 4 应用程序的问题 我创建了一个应用程序 其中的数据是从第三方 API 获取的 我遇到的问题是我的 API 多次调用 但我只发送了一次请求 经过一些研发后 我发现浏览器正在使用 OPTION 方法运行航班请求 但
  • Neo4j 中匹配/删除整个子图

    假设我的数据库中有一个大图 我想删除其中的整个子图 其中我只知道该子图的起始节点 是否可以编写一个密码查询来匹配并删除整个子图 警告 我不知道更多关于子图从哪个节点开始的信息 是的 您可以通过 APOC 程序从单个节点扩展到所有子图节点路径
  • 从源代码管理中丢失后如何生成新的 .pfx 文件?

    我正在使用 GitHub 托管我正在开发的开源 Windows 10 应用程序 我不小心忽略了应用程序的 PFX 文件 因此当我删除本地副本并重新克隆存储库时 我没有了MyApp TemporaryKey pfx文件 现在 Visual S
  • NLTK 上下文无关语法生成器

    我正在开发一个带有 Unicode 字符的非英语解析器 为此 我决定使用 NLTK 但它需要预定义的上下文无关语法 如下所示 S gt NP VP VP gt V NP V NP PP PP gt P NP V gt saw ate wal
  • 在 Web 应用程序和控制台应用程序之间共享配置设置

    我想与我的控制台应用程序 同一解决方案中的 2 个项目 共享我的 VS2010 3 5 Web 应用程序设置 例如连接字符串 smtp log4net 设置 这看起来很接近 http devlicio us blogs derik whit
  • PHP - 带 GET 查询的加号

    我有一个 PHP 脚本 它通过以下方法对字符串进行基本加密
  • iOS 7 自定义转换故障

    该视频显示了我遇到的问题 http www youtube com watch v C9od 2KZAbs http www youtube com watch v C9od 2KZAbs 我正在尝试使用 UIPanGestureRecog
  • Django 1.9 URLField 删除必要的 http:// 前缀

    我看到了很多关于此的问题 但还没有找到答案 这是我的模型 class UserProfile models Model user models OneToOneField User website models URLField max l
  • Sublime Text 2 是用什么编程语言编写的 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我喜欢 Sublime text 2 及其跨平台性 你知道这个程序是用什么语言编写的 或者使用了哪些技术吗 谢谢 来自推特 http mobile t
  • UISearchDisplayController 覆盖层和栏之间的间隙

    在我的应用程序中 我尝试添加搜索功能 我有表格视图控制器和自定义顶部栏视图 我在其中显示UISearchBar 问题是覆盖视图总是位于顶部栏下方一点 并且增加了它们之间的间隙 In my 表视图控制器 m文件的viewDidLoad sup
  • C++调用基类方法切片对象

    我有这样的事情 include