需要动态转换派生类:寻找替代方法

2023-12-28

我以这种简单的形式提出我的问题:

class animal {
public:
    animal() {
        _name="animal";
    }

    virtual void makenoise(){
        cout<<_name<<endl;
    }

    string get_name(){
        return _name;
    }

protected:
    string _name;
};

class cat : public animal {
public:
    cat() {
        this->_name="cat";
    }
};

class dog : public animal {
public:
    dog() {
        this->_name = "dog";
    }
};

我想将所有动物类型一起存储在一个容器中,例如:

vector<animal*> container;
barnyard.push_back(new animal());
barnyard.push_back(new dog());
barnyard.push_back(new cat());

在我的代码中的某个时刻,我需要将狗对象转换为猫对象。在这种转换中,我所需要的只是设置一个新的狗对象,并将其替换为与猫对应物所在的相同索引号。据我了解,dynamic_cast在这种情况下不起作用并基于C++ 强制转换为派生类 https://stackoverflow.com/questions/5313322/c-cast-to-derived-class,有人提到这样的转换不是一个好的做法。由于我的模型中的猫和狗具有不同的行为特性,因此我不想将它们的定义放入动物模型中。另一方面,将它们分别存储在不同的向量中将很难处理。有什么建议么?


You say:

我需要将狗对象转换为猫对象。

但是之后:

在这种转换中,我所需要的只是设置一个新的狗对象,并将其替换为与猫对应物所在的相同索引号。

需要转换或者更换吗??这是完全不同的操作。

要进行转换,您需要设置一个函数来接收一只狗并返回一只猫:

auto convertDogToCat(Dog const& dog) -> Cat {
    auto cat = Cat{};

    // fill cat's member using dog's values...

    return cat; 
}

但要替换,只需用新的重新分配即可:

//      v--- a cat is currently there
barnyard[ii] = new Dog{};
//           ^--- we replace the old pointer
//                with one that points to a dog.

但这会造成内存泄漏,要消除泄漏,只需使用std::unique_ptr:

#include <memory> // for std::unique_ptr

// The base class need a virtual destructor
class animal {
public:
    virtual ~animal() = default;

    // other members...
};

std::vector<std::unique_ptr<animal>> barnyard;
barnyard.emplace_back(std::make_unique<animal>());
barnyard.emplace_back(std::make_unique<dog>());
barnyard.emplace_back(std::make_unique<cat>());

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

需要动态转换派生类:寻找替代方法 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何在 C# 中打开 Internet Explorer 属性窗口

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

    我将直接前往 MCVE include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

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

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的

随机推荐

  • 查找过去 30 分钟内未访问/修改的文件?

    我有一个要求 我想向尚未访问过文件的用户发出通知30 min 使用 shell 脚本 是否可以找到未访问过的文件30 min使用查找 我查过 find opt SP tibmft scripts mtime 0 这将获取过去 24 小时内修
  • Guid.NewGuid() 的 C++ 版本是什么?

    我需要创建一个GUID在非托管 Windows C 项目中 我习惯了 C 我会用Guid NewGuid 非托管 Windows C 版本是什么 I think CoCreateGuid http msdn microsoft com en
  • Android WebView:在Android客户端上传图像。无法在服务器端 JavaScript 中获取文件类型

    我已经测试了 stackOverFlow 上的所有可用代码 但仍然无法正常工作 我使用Android 4 4 4并使用WebView将图像上传到服务器网页 但无法在服务器JavaScript代码中获取文件类型 alert type inpu
  • 如何将字符串转换为布尔值

    我有一个string可以是 0 或 1 并且保证不会是其他任何东西 所以问题是 将其转换为最佳 最简单和最优雅的方法是什么 bool 确实很简单 bool b str 1
  • 使用 HTTP 上传文件。收到错误:- HttpSendReuest 12005

    我想使用 HTTP 将 D er txt 上传到网络服务器 当我运行程序时 我收到 HttpSendRequest 12005 错误 我在我的网络服务器上使用了一个 PHP 脚本 它将接受该文件并将其存储在名为 upload 的预制目录中
  • 持久“记住我”Cookie 的竞争条件

    根据持久登录 Cookie 最佳实践 http fishbowl pastiche org 2004 01 19 persistent login cookie best practice 您不应该允许多次使用 记住我 令牌 持久性 coo
  • 由于未知表而无法删除表(错误 1051)

    我正在尝试从我继承的架构中删除一个表 当我SHOW TABLES I get Tables in schema a table 1 table 2 table 3 table 4 table 5 table 6 但是当我执行时
  • 领域 + NSTableView + NSArrayController

    我的 macOS 应用程序有一些问题 希望您能帮助我 我对 macOS 还很陌生 所以请多多关照 应用程序的一部分由一个简单的 NSTableView 组成 其内容绑定到 NSArrayController NSArrayControlle
  • Apache poi:删除 XWPFDocument 中的图片

    我正在编写一个应用程序 它采用带有一堆空段落和表格的 docx 文件 并使用 Apache POI 和数据库中的数据以编程方式填充它们 我提供的 docx 模型中还包含一系列图片 我的问题是我想删除不需要的图片 再次以编程方式 我看到有一种
  • TextMate 语法——规则的优先级

    我正在尝试修改 CSharp 语言的语法突出显示 因此我将在 C 字符串中获得 SQL 的语法突出显示 TextMate 支持嵌入语言 因此这似乎是可能的 我建立在csharp tmLanguage json https github co
  • 在 git 中交换暂存和未暂存更改的最短方法是什么?

    如果有一些更改添加到索引中 而有一些更改未添加到索引中 我如何交换这两组更改 它认为这对于临时提交来说是最容易做到的 当您有暂存和未暂存的提交时 在尝试对更改重新排序时可能会发生冲突 对分阶段的更改进行提交 创建一个分支供以后使用 git
  • 如何在 OpenAPI / Swagger 中递归引用封闭类型定义?

    我正在 Swagger 编辑器中编写 OpenAPI 定义 我的类型定义之一包含一个数组 其中包含与父元素类型相同的子元素 IE 像这样的东西 definitions TreeNode type object properties name
  • Centos 7 / Apache / PHP - mkdir():权限被拒绝

    在你大喊重复之前 并将我放逐至深渊 听我说完 我一直在为我工作的公司开发一个内联网站点 最初我是直接从运行的工作站上开发它Windows 7 IIS 当我接近完成网站 应用程序时 我得到了Centos 7正在运行的盒子Apache 所以我已
  • 定期刷新网页

    我的要求是我有一个 php 页面 必须根据数据库中的数据显示一些图形 数据 我想自动并定期刷新页面 以便可以更新图形 数据 因为数据仅在加载页面时获取 我怎样才能做到这一点 也许你可以尝试 setTimeout javascript 方法
  • 使用正则表达式查找字符串中的确切字符

    我有像下面这样的字符串 M10 end start M11 M1 M1 start M n1 end M1 我想要实现的目标是仅获得 M1 使用正则表达式 这是我当前的代码 Regex r new Regex M1 M1 输出如下所示 缺少
  • 在 scala 项目上 - 运行 sbt test 命令时出现错误 GC 开销限制超出

    我是 Scala 编程新手并正在学习GC overhead limit exceeded我执行时出错sbt test大型 scala 项目之一中的命令 有人知道我该如何解决这个问题吗 我得到了朋友的帮助 通过使用 mem 选项执行来增加内存
  • 用于检查属性不包含两个值的 CSS 选择器

    我有一个非常奇怪的 CSS 问题想要解决 我正在寻找任何 html 元素not have display none 以其任何有效形式 内联在style属性 一些例子
  • 如何访问 GTK/Gnome 上的主题字体和颜色

    假设我想编写一个特殊的文本编辑器小部件 我如何获得文本的默认主题颜色 选定的文本和背景 这是用户默认的 字体 我看到 GNOME 确实定义了 5 种特殊的系统字体和默认大小 为此 在 GNOME 外观配置对话框中 但我在 GTK 文档中没有
  • 如何在私有子网上运行Dataflow python?

    Apache Beam 2 1 0 添加了对在私有子网上的 Dataflow 运行器上提交作业且无需公共 IP 的支持 这是我们需要满足防火墙规则的 我打算使用squid代理来访问apt get pip等安装python依赖项 代理实例已经
  • 需要动态转换派生类:寻找替代方法

    我以这种简单的形式提出我的问题 class animal public animal name animal virtual void makenoise cout lt lt name lt