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