C++ 继承。更改对象数据类型

2023-12-30

我在强制更改我自己的对象上的数据类型时遇到问题。我有一个基类说A和两个派生自的类A called B and C。我传递物体B and C到一个检查它是什么类型的对象的函数(B or C)。下面是一些示例代码以及我的问题的问题:

enum ClassType {"B", "C"};

class A {
  protected:
     m_Type;

  public:
     ClassType Type() { return m_Type}
     ...
     ...
};

class B : public A {
   otherMemberFunctions();

}

 class C : public A {
   otherMemberFunctions();

}


void WhatType(vector<A*>* candidates){


  vector<B*> b_candidates(0);
  vector<C*> c_candidates(0);

  for(int i = 0; i < candidates->size(); i++){

    if(candidates->at(i)->Type() == B ){

      B* b = (B*) candidates->at(i);
      b_candidates(b);
   }

  //Same idea for Object C
  }
}

然后我会用WhatType(vector<A*>* candidates)如下

vector<B*>* b_example

WhatType((vector<A*>*) b_exmaple)

当我填满新的vector函数中的 b_candidatesWhatType。我仍然可以访问 中的成员函数吗?B对象还是我只能访问基类中的成员函数A?

当我更改对象的类型时,我对对象发生的情况感到困惑。

Here

WhatType((vector<A*>*) b_exmaple)

and here

B* b = (B*) candidates->at(i);

当您收到指向多态对象的指针时,您有两种类型:对象的“静态”类型,在您的情况下,它将是A *及其“动态”或“真实”类型,这取决于实际分配给它的内容。

铸造你的A * to B *强制编译器将该指针视为指向B;只要您确实知道该指针,这就是安全的实际上是一个指向B,否则编译器将开始编写无意义的代码(调用B另一种类型的数据的方法)。

您尝试实现的检查是 RTTI 的本地版本,它是一种机制,允许您知道哪个是指针的“真实类型”或多态类的引用,并安全地执行此类强制转换。查看typeid and dynamic_cast有关详细信息,请参阅 C++ 手册。 (顺便说一下,IIRCdynamic_cast不仅是为了防止动态类型错误时的安全,而且如果您在复杂的类层次结构中使用它,它还可能对您的指针执行一些额外的魔法;因此,避免对多态类进行 C 风格转换)

顺便说一句,一般来说,必须手动检查指针的“真实类型”才能转换它并使用它的方法,这被认为是“代码味道”:OOP 理想只能在以下情况下完成这项工作:virtual基类中可用的方法。


大警告:

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

C++ 继承。更改对象数据类型 的相关文章

随机推荐

  • MySQL json_arrayagg 左连接没有结果

    使用 MySQL 8 0json arrayagg https dev mysql com doc refman 8 0 en group by functions html function json arrayagg引入后 这使得聚合
  • YouTube Android API:YouTubePlayerFragment 加载微调器

    我正在使用 Android YouTube API 示例在我的应用程序中创建一个 chromeless YouTube 播放器 我遇到的问题是 即使视频已加载并开始播放 缓冲 加载进度条仍会继续显示在视频上 我可以在FragmentDemo
  • 测试 LDAP 与 Active Directory 服务器的连接

    我正在编写一个访问 LDAP 服务器 当前为 OpenLDAP 的 Linux 应用程序 我还想使用 Active Directory 服务器测试该应用程序 因为它可能会在生产中使用 Microsoft 是否有任何免费演示版或试用版可以让我
  • 快速 C++ 单生产者单消费者实现

    我正在寻找一个单生产者 单消费者的 FIFO 实现 它的执行速度比普通的锁定 写入 解锁 信号 waitForSignal 锁定 读取 解锁的东西更快 我正在寻找大多数 POSIX 操作系统 x86 特定的很好 支持的用 C 或 C 编写的
  • 如何以 DRY 方式定义变量

    假设我有一个写入 S3 存储桶的函数 因此 存储桶名称显然是一个 变量 不应硬编码到函数中 例如 开发与生产可能是不同的存储桶 现在 如果我希望函数能够访问它 我需要在至少两个地方使用存储桶名称 在该功能的 IAM 策略中 允许访问存储桶
  • 如何从函数内部确定函数名称

    如果我有一个像这样的 Bash 脚本 bin bash f echo function name f in this case 有什么办法可以做到这一点吗 这可以用在帮助消息中 例如 printf Usage s blah blah bla
  • 当 Facebook 用户在应用程序内发送“发送”对话框时,应用程序可以跟踪收件人吗?

    当用户打开 发送 对话框时 例如 他们可以在 收件人 行中添加或删除人员 如果用户实际按下 发送 应用程序是否有办法跟踪 收件人 行中的人员 不 至少目前不 如果你看一下官方文档 https developers facebook com
  • 在下划线中使用 debounce 函数

    我使用 underscore js 来运行任务 debounce task 100 如何停止执行 debounce debounce不执行任何操作 因此您无法阻止它 它returns一个负责去抖的新函数 如果不想再使用 就使用原来的功能即可
  • 使用 jquery 仅选择按钮前带有某个类的

    我有这个 html 标记 我想使用 jQuery 选择一些行 当按下 cerrar 类的按钮时 我想选择3 tr 在同一个按钮之前有类 hidden tr class main td class table sub title Test t
  • OO 设计原则适用于 Python 吗?

    似乎许多 OO 讨论都使用 Java 或 C 作为示例 例如 Head First 设计模式 这些模式同样适用于 Python 吗 或者如果我遵循设计模式 我最终会用 Python 编写 Java 这显然是一件非常糟糕的事情 最大的区别是
  • 如何设置 JFrame 的最小大小,以阻止用户将其大小调整为更小?

    我有一个JFrame不能小于特定尺寸 否则元素无法正确布局 我尝试过了setMinimumSize 并覆盖getMinimumSize 该框架的方法 但我仍然可以将框架调整为更小 那么 我必须倾听我的界限的变化吗 componentList
  • 使用IDEA的内容设计器时contentPane不能为null

    因此 我正在尝试使用 IntelliJ IDEA 的内容设计器来创建一个简单的 GUI 并且我遵循了使用它的所有指南 但是当从 IDEA 运行时 尚未编译成 JAR 它会返回以下错误 Exception in thread main jav
  • 如何保持 JButton 的透明度 (java)

    我正在制作一款坦克游戏 在我的菜单中 我想使用图片作为 jbuttons 它们是部分透明的 当它们出现在屏幕上时 透明部分会变成白色 i tried using setOpaque but this doesn t work i can t
  • Numpy:array1 中同时也是 array2 元素的元素的掩码

    我想知道是否有一种 numpy 自然的方法可以为 array2 中的元素在 array1 上创建二进制掩码 另一种说法是 数组 1 上的二进制掩码用于数组 1 和 2 的交集 这有效 def bin mask a b return sum
  • MongoDB 删除所有数据库

    我想知道是否有命令可以从我的 MongoDB 中删除所有数据库 我知道如果我只想删除一个数据表 我只需要输入数据库的名称 如下面的代码 但我不想指定它 mongo DB NAME eval db dropDatabase 您可以创建一个 j
  • 为什么 Socket.AcceptAsync 不触发 SocketAsyncEventArgs Completed 事件?

    我正在开发一个服务器应用程序 它将接收消息并做出响应 没什么新鲜的 所以 实际上我正在关注这个答案 https stackoverflow com questions 869744 how to write a scalable tcp i
  • 如何在javafx WebView中启用HTML5本地存储

    有没有办法在 javafx 2 2 WebView 上启用 HTML5 本地存储 无论我做什么 本地存储似乎都被禁用 不可用于 javafx 提供的 WebView 我什至使用它进行了测试http html5test com http ht
  • 如何获取html5音频的持续时间

    我有一个html5
  • 如何从 fopen FILE 结构中获取文件句柄?

    The fopen http msdn microsoft com en us library yeby3zcb aspx函数返回一个指向a的指针FILE结构 应将其视为不透明的值 而不处理其内容或含义 在 Windows 上 C 运行时是
  • C++ 继承。更改对象数据类型

    我在强制更改我自己的对象上的数据类型时遇到问题 我有一个基类说A和两个派生自的类A called B and C 我传递物体B and C到一个检查它是什么类型的对象的函数 B or C 下面是一些示例代码以及我的问题的问题 enum Cl