【问题标题】:how to access child instances in a vector in c++如何在 C++ 中访问向量中的子实例
【发布时间】:2010-04-02 23:45:39
【问题描述】:

我有一个父类和子类(从父类继承)。 在子类中,我有一个名为function_blah();的成员函数

我使用vector<parent*> A 来存储 5 个父实例、3 个子实例。所以向量中的元素总数为8。

我可以轻松访问元素 A[0] 到 A[4] 的成员函数,它们是父实例。 但是每当我尝试访问元素 A[5] 到 A[7] 的成员函数时,编译器都会抱怨 class parent has no member named 'function_blah'

我访问元素的方式是使用索引。 e.x A[i] 与 i = 0..7。这是正确的吗?如果没有,怎么办?

【问题讨论】:

  • 您的问题不完整:parent 类与子类之间的关系是什么?
  • 子类继承父类
  • 他说,“我有一个父类和子类(从父类继承)。”我认为关系很明确。

标签: c++ class vector parent


【解决方案1】:

您需要向下转换指向子类的指针才能在其上使用子函数。

当您使用parent* 访问子对象时,您实际上是在告诉编译器“将此对象视为parent”。由于function_blah()只存在于孩子身上,编译器不知道该怎么做。

您可以通过使用dynamic_cast 运算符向下转换 来改善这种情况:

child* c = dynamic_cast<child*>(A[6]);
c->function_blah();

这将执行运行时检查、类型安全的从 parent*child* 的转换,您可以在其中调用 function_blah()

此解决方案仅在您知道您要拉出的对象绝对是child 而不是parent 时才有效。如果存在不确定性,您需要做的是使用继承并在父级上创建一个虚拟方法,然后在子级上重载该方法。

【讨论】:

  • 非常感谢您的建议。我将使用虚函数。
【解决方案2】:

您正在存储没有 function_blah 方法的 parent*。您需要将 function_blah 设置为父级的虚拟方法,或者使用 dynamic_cast 向下转换为子级*。

【讨论】:

    【解决方案3】:

    成员_blah() 是否在parent 中声明为虚拟?或者它甚至在parent 中声明?因为如果不是,那么您将永远无法通过父指针访问_blah()。是的,你也必须沮丧,但前提是你确切地知道你期待一个 child 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2019-03-17
      • 2012-03-22
      • 2023-04-02
      • 1970-01-01
      • 2015-04-13
      相关资源
      最近更新 更多