当前位置: 首页 > 知识库问答 >
问题:

我可以报告子类值,其中子类存储在std::向量

樊烨烨
2023-03-14

我有一个指向父类动物的智能指针的std::vector。

std::vector<std::shared_ptr<animal>> farm; 

子类猫、狗和老鼠都有父类动物。向量中只指向猫、狗和老鼠。这样地

class cat : public animal {
public:
    bool claws;
};

farm.push_back(std::make_shared<cat>());
farm.push_back(std::make_shared<dog>());
farm.push_back(std::make_shared<mouse>());

Cat还有公共成员Cat。爪(bool型)。

我知道农场[0]。爪子不起作用,因为爪子不是农场的虚拟成员。在农场中循环时,有没有一种方法可以访问爪子而不创建单独的虚拟功能?在实际问题中,我有许多不同的子类变量,我想在程序在服务器场上循环时向用户报告(无限期)。

共有1个答案

祁雪峰
2023-03-14

您可以为此使用动态\u cast或标准::动态\u指针\u cast,例如:

if(auto catPtr = std::dynamic_pointer_cast<cat>(animalPtr))
{
    // now you use catPtr.claws
}

(假设AnimalPtr的类型是std::shared_ptr

 类似资料:
  • 例如,如果在类“动物”中有字符串变量“物种”,并且我创建了一个子类“猫”,我如何初始化物种变量,以便对于猫,它包含值“cat”?对不起,这个愚蠢的问题。

  • 问题内容: 我有点在等待这个问题的答案。 我很想知道是否可以在if子句中检查变量的同时保存变量。 假设我有这段代码。 我现在独立处理“失败”状态,即使结果相同。我可以像这样将它们聚在一起: 已经有很多更整洁的代码。如果foo为null,它将在那里停止并且不会尝试foo.getBar(在if中),因此我不会获得NPE。我要增强的最后一件事是主要问题:我真的给两次foo.getBar()打电话吗?如果

  • 我知道下一个场景:(奇怪的格式,我知道) 如果线程#1和线程#2在完全相同的时间输入,这将发生: > 两者都将执行" CMPXCHG指令同时对两个线程生效: 3.1锁定前缀本机使用 3.2线程#1或#2首先到达,赢得比赛。 3.3获胜线程比较(是aBoolean==true?)这将返回"true",因此一个布尔值将被设置为"false"。 3.4 aBoolean现在为false。 3.5线程丢失

  • 但是当我移除EmployeeID参数时,我希望移除过滤器。所以所有的结果都应该显示出来。 我的问题是,在sql查询中传递可选where的正确方式是什么。

  • 问题内容: 在Java中,我们可以将超类Object传递给子类引用吗? 我知道这是一个奇怪的问题/实际上不可行,但是我想了解这个背后的逻辑为什么在Java中不允许这样做。 如果Java允许编译第1行会发生什么?问题将在哪里出现? 欢迎任何输入/链接。 问题答案: 如果允许您的语句进行编译,那么这将破坏多态性的原理,这是该语言具有的功能之一。 另外,您应该熟悉 编译时间类型 和 运行时类型的 含义:

  • 问题内容: 指这里 A是预编译的Java类(我也有源文件)B是我正在编写的Java类 B扩展了A。 如何实现逻辑,以便A可以调用B拥有的方法。 以下是条件: 我不想触摸A(尽管没有其他解决方案,但这只是最后一个选择)。 我不想使用反射。 如前所述,如果需要,我可以修改A。哪种方式可能是可行的解决方案? 问题答案: 类应该定义将要调用的方法(可能是抽象方法,根据Paul Haahr的出色指南,A应该