如何将协变返回类型与智能指针一起使用?

2023-12-12

我有这样的代码:

class RetInterface {...}

class Ret1: public RetInterface {...}

class AInterface
{
  public:
     virtual boost::shared_ptr<RetInterface> get_r() const = 0;
     ...
};

class A1: public AInterface
{
  public:
     boost::shared_ptr<Ret1> get_r() const {...}
     ...
};

这段代码无法编译。

在视觉工作室中它提出了

C2555:重写虚函数返回类型不同并且不是 协变

如果我不使用boost::shared_ptr但返回原始指针,代码编译(我理解这是由于协变返回类型在 C++ 中)。我可以看到问题是因为boost::shared_ptr of Ret1不是源自boost::shared_ptr of RetInterface。但我想回来boost::shared_ptr of Ret1用于其他类,否则我必须在返回后转换返回值。

  1. 难道我做错了什么?
  2. 如果不是,为什么语言是这样的——它应该是可扩展的,以处理这种情况下智能指针之间的转换?有理想的解决方法吗?

首先,这确实是 C++ 中的工作原理:派生类中的虚函数的返回类型必须与基类中的相同。有一个特殊的例外,即返回某个类 X 的引用/指针的函数可以被返回从 X 派生的类的引用/指针的函数覆盖,但正如您所注意到的,这不允许smart指针(例如shared_ptr),仅用于普通指针。

如果你的界面RetInterface足够全面,那么您不需要知道调用代码中实际返回的类型。一般来说,无论如何它都没有意义:原因get_r is a virtual函数首先是因为您将通过指针或对基类的引用来调用它AInterface,在这种情况下,您无法知道派生类将返回什么类型。如果您用实际的A1参考,你可以创建一个单独的get_r1函数于A1这就是你所需要的。

class A1: public AInterface
{
  public:
     boost::shared_ptr<RetInterface> get_r() const
     {
         return get_r1();
     }
     boost::shared_ptr<Ret1> get_r1() const {...}
     ...
};

或者,您可以使用访客模式或类似我的模式动态双调度将回调传递给返回的对象的技术,然后该对象可以使用正确的类型调用回调。

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

如何将协变返回类型与智能指针一起使用? 的相关文章

随机推荐

  • Keras 模型训练良好,但预测的值相同

    让我们尝试制作MobileNet V 2在嘈杂的图像上找到一条亮带 是的 使用深度卷积网络来实现这样的策略有点过分了 但最初它的目的就像烟雾测试一样 以确保模型有效 我们将使用合成数据对其进行训练 import numpy as np im
  • matplotlib 中的自动缩放,在同一图表中绘制不同的时间序列

    我有一个 主 熊猫数据框 其中包含多个术语的 极性 值的时间序列 我想使用其中的 4 个 因此我提取了 4 个单独的数据帧 其中包含时间序列 所有术语的时间序列相同 但极性值不同 我使用下面的代码将它们绘制在 4 个单独的 matplotl
  • 在keras中使用Conv3d将多个图像输入到同一个CNN

    我想使用 conv3d 将 8 张图像同时输入到同一个 CNN 结构中 我的CNN模型如下 def build sample frame height width channels classes model Sequential inpu
  • 弹性搜索,多个索引与一个索引以及不同数据集的类型?

    我有一个使用 MVC 模式开发的应用程序 我现在想索引它的多个模型 这意味着每个模型都有不同的数据结构 是使用多个索引 每个模型一个 还是每个模型在同一索引中使用一个类型更好 我认为这两种方式都需要不同的搜索查询 我刚刚开始做这个 如果数据
  • MVC HttpRequestValidationException 异常

    我正在编写 MVC 5 互联网应用程序 并且有一个关于HttpRequestValidationException例外 我之前在控制器中的代码如下 protected override void OnException ExceptionC
  • 使用 Socket.BeginAccept/EndAccept 进行多个连接

    与同步不同Accept BeginAccept不为新创建的连接提供套接字 EndAccept然而 它也会阻止未来的连接被接受 所以我编写了以下代码来允许多个 客户端 连接到我的服务器 serverSocket BeginAccept Acc
  • Angular 2 服务双向数据绑定

    我有一个salary service and a player component 如果服务中的工资变量更新 玩家组件中的视图是否也会更新 或者 Angular 2 中不是这样吗 当页面首次加载时 我在player component 视图
  • JNI 集成到 AOSP 构建中

    我需要通过添加一些自定义库来更改 设置 应用程序 但我在配置方面遇到问题 当我尝试调用 System loadLibrary mylibrary 时 我得到libraryPath data app lib com settings 1 fi
  • 使用 System.Transactions 时保存点的替代方案

    我如何使用来自的课程System Transactions命名空间以达到与我使用时类似的效果SqlTransaction Save 保存点 and SqlTransaction Rollback savePoint 使用这两种方法的效果是能
  • MySql 连接中的 Java ClassNotFoundException (java.sql.SQLType)

    我正在开发一个android应用程序 它连接到正在工作的mysql服务器 但现在出现java lang ClassNotFoundException错误 找不到类 java sql SQLType 我不知道发生了什么 我唯一改变的是mysq
  • 如何在电子邮件正文中添加图像

    我想在电子邮件正文中添加图像 我不想在电子邮件中附加图像 而是在电子邮件正文中添加图像 这个怎么做 我正在用这个 img src or img src 然后图像就这样显示 不幸的是 用意图来做到这一点是不可能的 例如 粗体文本显示在 Edi
  • 停止 Delphi Indy 线程而不必等待结束超时

    这是我第一次使用 Delphi 开发多线程应用程序 所以一切对我来说仍然很新鲜 但我读了很多书 我的线程很简单 简而言之 我只是使用 Indy IdHTTP 来获取网页的内容 然后验证内容是否包含字符串 这里没有问题 现在 为了终止线程 我
  • AlarmManager 在模拟器中触发,但不在物理设备上触发

    我有一个调用 AlarmManager 的应用程序 Intent intent intent new Intent context MyEventReceiver class PendingIntent appIntent PendingI
  • 在Android中维护标准应用程序Activity返回堆栈状态(使用singleTask启动模式)

    我无法找到如何维护开发中的 Android 应用程序的状态 只是为了澄清 我不是在谈论维护活动状态 即跟踪特定活动的文本框值 复选框等 比方说 我的应用程序有两个活动A and B 当我启动我的应用程序时 它会带我进行活动A 然后按下按钮即
  • 使用多个合约运行 WCF ServiceHost

    使用单个合约运行 ServiceHost 工作正常 如下所示 servicehost new ServiceHost typeof MyService1 servicehost AddServiceEndpoint typeof IMySe
  • 付款 - IAP 或第三方

    我们正在开发一个 iOS 应用程序 该应用程序提供一些可在应用程序内使用的积分 付费 我们对此几乎没有疑问 我们可以使用 Paypal 或类似的第三方支付网关吗 或者我们需要为此实施 IAP 如果需要实施IAP 那么分成比例是多少 如果我们
  • 在 BlackBerry sim 上使用“;deviceside=true”执行 browserfield 时出现问题

    我正在尝试使用中给出的示例代码Apress 高级黑莓开发书 问题是当我使用 MDS 启动模拟器时 会显示网页 但是当我将 deviceside true 附加到url 然后启动没有MDS的模拟器时 网页不会显示 仅显示白色屏幕 import
  • 在 eclipse 中使用 Ant 调试 TestNg java 代码

    我正在尝试在 Eclipse Mars 中调试一个项目 该项目使用 TestNg 和 Apache Ant 进行构建进行测试自动化 使用可用的解决方案 我能够调试 ant build xml 文件 但 java 代码内的断点没有命中 任何人
  • 如何在 Mac 上使用脚本更改 XML 属性的特定值

    我的任务是编写一个脚本来更改大约 1000 台 Mac 上的 XML 文件中的特定值 显然 这需要编写脚本 并且最好只使用 Mac 上已有的工具 即不需要额外安装 这里的最终目标是在与活动目录相关的特定文件中禁用 IPv6 例如 旧文件
  • 如何将协变返回类型与智能指针一起使用?

    我有这样的代码 class RetInterface class Ret1 public RetInterface class AInterface public virtual boost shared ptr