如何在 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++ 中访问向量中的子实例的主要内容,如果未能解决你的问题,请参考以下文章