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

时间:2010-04-02 23:45:39

标签: c++ class vector parent

我有一个父类和子类(继承自父类)。 在子类中,我有一个名为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。这是对的吗?如果没有,怎么样?

3 个答案:

答案 0 :(得分:4)

您需要向下转发指向子类的指针,以便在其上使用子函数。

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

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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