2010-04-02 77 views
2

我有一个父类和子类(从父类继承)。 在子类中,我有一个名为function_blah();的成员函数如何在C++中访问一个向量中的子实例

我用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。这是对的吗?如果没有,如何?

+0

你的问题是不完整的:父类和子类之间的关系是什么? – Klaim 2010-04-02 23:48:35

+0

子类继承父类 – root 2010-04-02 23:51:00

+1

他说:“我有一个父类和子类(从父类继承)”。我认为这种关系很明确。 – Ben 2010-04-02 23:51:05

回答

5

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

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

您可以通过使用dynamic_cast操作向下转换改善这一点:

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

这将执行从parent*一个运行时检查,类型安全强制转换为child*在那里你可以打电话function_blah()

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

+0

非常感谢您的建议。我将使用虚拟功能。 – root 2010-04-03 00:38:43

2

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

0

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

相关问题