如何在 C++ 中访问向量中的子实例

Posted

技术标签:

【中文标题】如何在 C++ 中访问向量中的子实例【英文标题】:how to access child instances in a vector in 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 类与子类之间的关系是什么? 子类继承父类 他说,“我有一个父类和子类(从父类继承)。”我认为关系很明确。 【参考方案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 类型。

【讨论】:

以上是关于如何在 C++ 中访问向量中的子实例的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的“指向对象的指针”向量访问对象

如何将对象存储在向量中的对象中? (C++)

C++:如何检测向量中的重复项并打印一份?

无法访问存储在多维向量中的对象(C++)

c++中向量中的随机访问[重复]

访问冲突 C++(删除向量中的项目)